You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2005/04/25 00:03:55 UTC

svn commit: r164504 - /geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java

Author: djencks
Date: Sun Apr 24 15:03:55 2005
New Revision: 164504

URL: http://svn.apache.org/viewcvs?rev=164504&view=rev
Log:
support for holders/OUT/INOUT parameters

Modified:
    geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java

Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java?rev=164504&r1=164503&r2=164504&view=diff
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java (original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java Sun Apr 24 15:03:55 2005
@@ -21,18 +21,23 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.List;
+import java.util.Map;
 import javax.security.auth.Subject;
+import javax.xml.rpc.holders.Holder;
 
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
 import org.apache.axis.client.Call;
+import org.apache.axis.description.ParameterDesc;
+import org.apache.axis.utils.JavaUtils;
 import org.apache.geronimo.security.ContextManager;
 import org.apache.geronimo.security.jaas.NamedUsernamePasswordCredential;
 
 /**
  * @version $Rev:  $ $Date:  $
  */
-public class ServiceEndpointMethodInterceptor implements MethodInterceptor{
+public class ServiceEndpointMethodInterceptor implements MethodInterceptor {
 
     private final GenericServiceEndpoint stub;
     private final OperationInfo[] operations;
@@ -74,27 +79,65 @@
                     }
                 }
                 if (!found) {
-                    throw new IllegalStateException("no NamedUsernamePasswordCredential found for name "  + credentialsName);
+                    throw new IllegalStateException("no NamedUsernamePasswordCredential found for name " + credentialsName);
                 }
             }
         }
         Object response = null;
+        List parameterDescs = operationInfo.getOperationDesc().getParameters();
+        Object[] unwrapped = extractFromHolders(objects, parameterDescs);
         try {
-            response = call.invoke(objects);
+            response = call.invoke(unwrapped);
         } catch (RemoteException e) {
             throw operationInfo.unwrapFault(e);
         }
 
         if (response instanceof java.rmi.RemoteException) {
             throw operationInfo.unwrapFault((RemoteException) response);
-        }
-        else {
+        } else {
             stub.extractAttachments(call);
+            Map outputParameters = call.getOutputParams();
+            putInHolders(outputParameters, objects, parameterDescs);
             Class returnType = operationInfo.getOperationDesc().getReturnClass();
-            if (response == null || returnType.isAssignableFrom(response.getClass())) {
+            //return type should never be null... but we are not objecting if wsdl-return-value-mapping is not set.
+            if (response == null || returnType == null || returnType.isAssignableFrom(response.getClass())) {
                 return response;
             } else {
                 return org.apache.axis.utils.JavaUtils.convert(response, returnType);
+            }
+        }
+    }
+
+    private Object[] extractFromHolders(Object[] objects, List parameterDescs) throws JavaUtils.HolderException {
+        if (objects.length != parameterDescs.size()) {
+            throw new IllegalArgumentException("Mismatch parameter count: expected: " + parameterDescs.size() + ", actual: " + objects.length);
+        }
+        Object[] unwrapped = new Object[objects.length];
+        for (int i = 0; objects != null && i < objects.length; i++) {
+            Object parameter = objects[i];
+            ParameterDesc parameterDesc = (ParameterDesc) parameterDescs.get(i);
+
+            if (parameterDesc.getMode() == ParameterDesc.INOUT) {
+                unwrapped[i] = JavaUtils.getHolderValue((Holder) parameter);
+            } else if (parameterDesc.getMode() == ParameterDesc.IN) {
+                unwrapped[i] = parameter;
+            }
+        }
+        return unwrapped;
+    }
+
+    private void putInHolders(Map outputParameters, Object[] objects, List parameterDescs) throws JavaUtils.HolderException {
+        for (int i = 0; i < objects.length; i++) {
+            Object parameter = objects[i];
+            ParameterDesc parameterDesc = (ParameterDesc) parameterDescs.get(i);
+            if ((parameterDesc.getMode() == ParameterDesc.INOUT) ||
+                    (parameterDesc.getMode() == ParameterDesc.OUT)) {
+                Object returned = outputParameters.get(parameterDesc.getQName());
+                if (returned instanceof Holder) {
+                    //TODO this must be a bug somewhere!!!!
+                    returned = JavaUtils.getHolderValue(returned);
+                }
+                JavaUtils.setHolderValue((Holder) parameter, returned);
             }
         }
     }