You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by da...@apache.org on 2006/10/12 00:52:45 UTC

svn commit: r463023 - in /incubator/cxf/trunk/rt: core/src/main/java/org/apache/cxf/service/invoker/ frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ frontend/jaxws/src/test/java/org/apache/cxf/jaxws/ frontend/jaxws/src/test/java/org/apache/cxf/jaxws...

Author: dandiep
Date: Wed Oct 11 15:52:44 2006
New Revision: 463023

URL: http://svn.apache.org/viewvc?view=rev&rev=463023
Log:
o CXF-115: Add constructor to provide service to EndpointImpl.
  It actually provides a servicefactory as we need to grab information
  from it.
o Add the ability to provide Exchange as a parameter to an invocation.
  This is a feature in XFire and is really handy in places where you're 
  writing a simple service which gets a Source and needs additional
  info from the Exchange.

Modified:
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstTest.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/EndpointImplTest.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/provider/ProviderTest.java
    incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/DefaultServiceConfiguration.java
    incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java
    incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/HelloService.java
    incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/ReflectionServiceFactoryTest.java

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java Wed Oct 11 15:52:44 2006
@@ -23,7 +23,6 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.cxf.helpers.CastUtils;
@@ -53,18 +52,26 @@
         m = matchMethod(m, serviceObject);
         List<Object> params = CastUtils.cast((List<?>)o);
 
+        return invoke(exchange, serviceObject, m, params);
+    }
+
+    protected Object invoke(Exchange exchange, final Object serviceObject, Method m, List<Object> params) {
         Object res;
         try {
             Object[] paramArray = params.toArray();
+            
+            insertExchange(m, paramArray, exchange);
+            
             res = m.invoke(serviceObject, paramArray);
             if (exchange.isOneWay()) {
                 return null;
             }
+            
             List<Object> retList = new ArrayList<Object>();
             if (!((Class)m.getReturnType()).getName().equals("void")) {
                 retList.add(res);
             }
-            return Arrays.asList(retList.toArray());
+            return retList;
         } catch (InvocationTargetException e) {
             Throwable t = e.getCause();
             if (t == null) {
@@ -76,6 +83,26 @@
         }
     }
 
+    public Object[] insertExchange(Method method, Object[] params, Exchange context) {
+        Object[] newParams = params;
+        for (int i = 0; i < method.getParameterTypes().length; i++) {
+            if (method.getParameterTypes()[i].equals(Exchange.class)) {
+                newParams = new Object[params.length + 1];
+
+                for (int j = 0; j < newParams.length; j++) {
+                    if (j == i) {
+                        newParams[j] = context;
+                    } else if (j > i) {
+                        newParams[j] = params[j - 1];
+                    } else {
+                        newParams[j] = params[j];
+                    }
+                }
+            }
+        }
+        return newParams;
+    }
+    
     /**
      * Creates and returns a service object depending on the scope.
      */

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java Wed Oct 11 15:52:44 2006
@@ -67,6 +67,20 @@
     private JaxWsImplementorInfo implInfo;
     private ReflectionServiceFactoryBean serviceFactory;
     
+    public EndpointImpl(Bus b, Object implementor, JaxWsServiceFactoryBean serviceFactory) {
+        this.bus = b;
+        this.serviceFactory = serviceFactory;
+        this.implInfo = serviceFactory.getJaxWsImplementorInfo();
+        this.service = serviceFactory.getService();
+        this.implementor = implementor;
+        
+        if (this.service == null) {
+            service = serviceFactory.create();
+        }
+        
+        doInit = true;
+    }
+    
     @SuppressWarnings("unchecked")
     public EndpointImpl(Bus b, Object i, String uri) {
         bus = b;

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java Wed Oct 11 15:52:44 2006
@@ -21,70 +21,33 @@
 
 import java.lang.reflect.Array;
 import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import javax.xml.ws.Holder;
 
-import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.message.Exchange;
-import org.apache.cxf.service.Service;
-import org.apache.cxf.service.factory.MethodDispatcher;
-import org.apache.cxf.service.invoker.Invoker;
-import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.invoker.BeanInvoker;
 
-public class JAXWSMethodInvoker implements Invoker {
-
-    private Object bean;
+public class JAXWSMethodInvoker extends BeanInvoker {
 
     public JAXWSMethodInvoker(Object bean) {
-        super();
-        this.bean = bean;
+        super(bean);
     }
 
     @SuppressWarnings("unchecked")
-    public Object invoke(Exchange exchange, Object o) {
-        BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);
-        MethodDispatcher md = (MethodDispatcher) exchange.get(Service.class).get(
-                        MethodDispatcher.class.getName());
-        Method m = md.getMethod(bop);
-        
-        List<Object> params = (List<Object>) o;
-
+    protected Object invoke(Exchange exchange, final Object serviceObject, Method m, List<Object> params) {
         checkHolder(m, params, exchange);
-        Object res;
-        try {
-            Object[] paramArray = params.toArray();
-            res = m.invoke(bean, paramArray);
-            if (exchange.isOneWay()) {
-                return null;
-            }
-            List<Object> retList = new ArrayList<Object>();
-            if (!((Class) m.getReturnType()).getName().equals("void")) {
-                retList.add(res);
-            }
-            for (int i = 0; i < paramArray.length; i++) {
-                if (paramArray[i] instanceof Holder) {
-                    retList.add(((Holder) paramArray[i]).value);
-                }
-            }
-            return Arrays.asList(retList.toArray());
-        } catch (IllegalAccessException e) {
-            throw new Fault(e);
-        } catch (IllegalArgumentException e) {
-            throw new Fault(e);
-        } catch (InvocationTargetException e) {
-            Throwable target = e;
-            if (e.getCause() instanceof Exception) {
-                target = e.getCause();
+
+        List<Object> res = (List<Object>) super.invoke(exchange, serviceObject, m, params);
+        for (Object o : params) {
+            if (o instanceof Holder) {
+                res.add(((Holder) o).value);
             }
-            throw new Fault(target);
         }
+        return res;
     }
 
     @SuppressWarnings("unchecked")
@@ -92,37 +55,31 @@
         if (method != null) {
 
             Type[] para = method.getGenericParameterTypes();
-            for (int i = 0; i < para.length; i++) {               
+            for (int i = 0; i < para.length; i++) {
                 if (para[i] instanceof ParameterizedType) {
-                    ParameterizedType paramType = (ParameterizedType) para[i];
-                    if (((Class) paramType.getRawType()).getName().equals("javax.xml.ws.Holder")) {
-                        
+                    ParameterizedType paramType = (ParameterizedType)para[i];
+                    if (((Class)paramType.getRawType()).getName().equals("javax.xml.ws.Holder")) {
+
                         Object rawType = paramType.getActualTypeArguments()[0];
                         Class rawClass = null;
                         if (rawType instanceof GenericArrayType) {
-                            rawClass = (Class) ((GenericArrayType) rawType).getGenericComponentType();
+                            rawClass = (Class)((GenericArrayType)rawType).getGenericComponentType();
                             rawClass = Array.newInstance(rawClass, 0).getClass();
-                        } else if (rawType instanceof Class) {     
-                            rawClass = (Class) rawType;
+                        } else if (rawType instanceof Class) {
+                            rawClass = (Class)rawType;
                         } else if (rawType instanceof ParameterizedType) {
                             rawClass = (Class)((ParameterizedType)rawType).getRawType();
                         }
-                       // param = new Holder((Class) rawClass);
-                        
-                        
+                        // param = new Holder((Class) rawClass);
+
                         if (i >= params.size()) {
                             params.add(new Holder());
                         } else {
                             params.set(i, new Holder(params.get(i)));
                         }
                     }
-
-                } 
-                
+                }
             }
-
         }
-
     }
-
 }

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstTest.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstTest.java Wed Oct 11 15:52:44 2006
@@ -108,7 +108,7 @@
     public void testEndpoint() throws Exception {
         Hello service = new Hello();
 
-        EndpointImpl ep = new EndpointImpl(getBus(), service, null);
+        EndpointImpl ep = new EndpointImpl(getBus(), service, (String) null);
         ep.publish("http://localhost:9090/hello");
 
         Node res = invoke("http://localhost:9090/hello", 

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/EndpointImplTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/EndpointImplTest.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/EndpointImplTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/EndpointImplTest.java Wed Oct 11 15:52:44 2006
@@ -25,7 +25,9 @@
 
 import javax.xml.ws.WebServiceContext;
 
+import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.service.invoker.BeanInvoker;
 import org.apache.cxf.transport.Conduit;
 import org.apache.cxf.transport.MessageObserver;
 import org.apache.hello_world_soap_http.GreeterImpl;
@@ -49,6 +51,30 @@
         
         assertNotNull(ctx);
         
+    }
+    
+
+    public void testEndpointServiceConstructor() throws Exception {   
+        GreeterImpl greeter = new GreeterImpl();
+        JaxWsServiceFactoryBean serviceFactory = new JaxWsServiceFactoryBean();
+        serviceFactory.setBus(getBus());
+        serviceFactory.setInvoker(new BeanInvoker(greeter));
+        serviceFactory.setServiceClass(GreeterImpl.class);
+        
+        EndpointImpl endpoint = new EndpointImpl(getBus(), greeter, serviceFactory);
+ 
+        WebServiceContext ctx = greeter.getContext();
+        assertNull(ctx);
+        try {
+            String address = "http://localhost:8080/test";
+            endpoint.publish(address);
+        } catch (IllegalArgumentException ex) {
+            //assertTrue(ex.getCause() instanceof BusException);
+            //assertEquals("BINDING_INCOMPATIBLE_ADDRESS_EXC", ((BusException)ex.getCause()).getCode());
+        }
+        ctx = greeter.getContext();
+        
+        assertNotNull(ctx);
     }
 
     static class EchoObserver implements MessageObserver {

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/provider/ProviderTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/provider/ProviderTest.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/provider/ProviderTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/provider/ProviderTest.java Wed Oct 11 15:52:44 2006
@@ -26,7 +26,7 @@
 
 public class ProviderTest extends AbstractJaxWsTest {
     public void testInvocation() throws Exception {
-        EndpointImpl ep = new EndpointImpl(getBus(), new PayloadProvider(), null);
+        EndpointImpl ep = new EndpointImpl(getBus(), new PayloadProvider(), (String) null);
         ep.publish("http://localhost:9000/Provider");
         
         Node response = invoke("http://localhost:9000/Provider",

Modified: incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/DefaultServiceConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/DefaultServiceConfiguration.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/DefaultServiceConfiguration.java (original)
+++ incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/DefaultServiceConfiguration.java Wed Oct 11 15:52:44 2006
@@ -26,6 +26,7 @@
 
 import org.apache.cxf.common.util.ParamReader;
 import org.apache.cxf.helpers.ServiceUtils;
+import org.apache.cxf.message.Exchange;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.service.model.InterfaceInfo;
 import org.apache.cxf.service.model.OperationInfo;
@@ -126,7 +127,14 @@
 
     @Override
     public Boolean isInParam(Method method, int j) {
-        return j >= 0;
+        if (j >= 0) {
+            Class c = method.getParameterTypes()[j];
+            if (Exchange.class.equals(c)) {
+                return false;
+            }
+            return true;
+        }
+        return false;
     }
 
     @Override

Modified: incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java (original)
+++ incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java Wed Oct 11 15:52:44 2006
@@ -52,7 +52,7 @@
         super();
         bindingFactory = new SoapBindingInfoFactoryBean();
     }
-
+    
     public Server create() {
         try {
             service = serviceFactory.getService();

Modified: incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/HelloService.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/HelloService.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/HelloService.java (original)
+++ incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/HelloService.java Wed Oct 11 15:52:44 2006
@@ -18,8 +18,11 @@
  */
 package org.apache.cxf.service.factory;
 
+import org.apache.cxf.message.Exchange;
+
 public interface HelloService {
     String sayHello();
     void ping();
-    String echo(String text);
+    String echoWithExchange(Exchange ex, String text);
+    String echo(String text);    
 }

Modified: incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/ReflectionServiceFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/ReflectionServiceFactoryTest.java?view=diff&rev=463023&r1=463022&r2=463023
==============================================================================
--- incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/ReflectionServiceFactoryTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/simple/src/test/java/org/apache/cxf/service/factory/ReflectionServiceFactoryTest.java Wed Oct 11 15:52:44 2006
@@ -81,7 +81,7 @@
         ServiceInfo si = service.getServiceInfo();
         InterfaceInfo intf = si.getInterface();
         
-        assertEquals(3, intf.getOperations().size());
+        assertEquals(4, intf.getOperations().size());
         
         String ns = si.getName().getNamespaceURI();
         OperationInfo sayHelloOp = intf.getOperation(new QName(ns, "sayHello"));
@@ -100,6 +100,10 @@
         MessagePartInfo mpi = messageParts.get(0);
         assertEquals("out", mpi.getName().getLocalPart());
         assertEquals(String.class, mpi.getProperty(Class.class.getName()));
+
+        
+        OperationInfo op = si.getInterface().getOperation(new QName(ns, "echoWithExchange"));
+        assertEquals(1, op.getInput().getMessageParts().size());
     }
     
     public void testWrappedBuild() throws Exception {
@@ -108,7 +112,7 @@
         ServiceInfo si = service.getServiceInfo();
         InterfaceInfo intf = si.getInterface();
         
-        assertEquals(3, intf.getOperations().size());
+        assertEquals(4, intf.getOperations().size());
         
         String ns = si.getName().getNamespaceURI();
         OperationInfo sayHelloOp = intf.getOperation(new QName(ns, "sayHello"));
@@ -179,7 +183,7 @@
         assertEquals("HelloServiceSoapBinding", b.getName().getLocalPart());
         assertEquals("document", sb.getStyle());
         
-        assertEquals(3, b.getOperations().size());
+        assertEquals(4, b.getOperations().size());
         
         BindingOperationInfo bop = b.getOperations().iterator().next();
         SoapOperationInfo sop = bop.getExtensor(SoapOperationInfo.class);