owenb       2003/06/11 05:26:44

  Modified:    java/src/org/apache/wsif/base WSIFClientProxy.java
  Log:
  Improvement to fault handling (bugzilla 18612) - if the fault message contains a 
throwable
  object and that throwable is declared on the SEI method, do not wrap it in a 
WSIFException
  simply throw it.
  
  Revision  Changes    Path
  1.22      +31 -23    xml-axis-wsif/java/src/org/apache/wsif/base/WSIFClientProxy.java
  
  Index: WSIFClientProxy.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis-wsif/java/src/org/apache/wsif/base/WSIFClientProxy.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- WSIFClientProxy.java      7 Mar 2003 14:59:30 -0000       1.21
  +++ WSIFClientProxy.java      11 Jun 2003 12:26:44 -0000      1.22
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 2002 The Apache Software Foundation.  All rights 
  + * Copyright (c) 2003 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -50,7 +50,7 @@
    * This software consists of voluntary contributions made by many
    * individuals on behalf of the Apache Software Foundation and was
    * originally based on software copyright (c) 2001, 2002, International
  - * Business Machines, Inc., http://www.apache.org.  For more
  + * Business Machines, Inc., http://www.ibm.com.  For more
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  @@ -230,15 +230,9 @@
   
       /**
        * Invoke a user method. The java proxy support calls this method.
  -     * 
  -     * The fault from the fault message is not passed back to caller 
  -     * (but it should be). However none of the existing providers set 
  -     * the fault message. I'm not sure what to do with the fault message
  -     * anyhow. I guess raise a WSIFException which is what the current
  -     * providers do with faults already.
        */
       public Object invoke(Object proxy, Method method, Object[] args)
  -        throws WSIFException {
  +        throws Throwable {
           Trc.entry(this, method, args); // Tracing proxy cause a hang
   
           Operation operation = findMatchingOperation(method, args);
  @@ -286,11 +280,13 @@
           }
   
           boolean usingwrapped = false;
  -        List inputParts = (inputMessage == null) 
  -           ? new ArrayList() 
  -           : inputMessage.getOrderedParts(null);
  +        List inputParts =
  +            (inputMessage == null)
  +                ? new ArrayList()
  +                : inputMessage.getOrderedParts(null);
           if (args != null) {
  -             usingwrapped = unWrapIfRequired(operation.getName(), inputParts, args);
  +            usingwrapped =
  +                unWrapIfRequired(operation.getName(), inputParts, args);
               Iterator partIt = inputParts.iterator();
               for (int argIndex = 0; partIt.hasNext(); argIndex++) {
                   Part part = (Part) partIt.next();
  @@ -308,15 +304,25 @@
                       wsifOutputMessage,
                       wsifFaultMessage);
               if (!success) {
  -                StringBuffer sb = new StringBuffer();
  -                Iterator it = wsifFaultMessage.getPartNames();
  +                Iterator it = wsifFaultMessage.getParts();
                   while (it.hasNext()) {
  -                    String name = (String) it.next();
  -                    sb.append(name).append(":").append(
  -                        wsifFaultMessage.getObjectPart(name)).append(
  -                        " ");
  +                    Object fault = it.next();
  +                    if (fault instanceof Throwable) {
  +                        Class[] exs = method.getExceptionTypes();
  +                        for (int e = 0; e < exs.length; e++) {
  +                            if (exs[e].isAssignableFrom(fault.getClass())) {
  +                                throw (Throwable) fault;
  +                            }
  +                        }
  +                        throw new WSIFException("Operation failed, fault message 
contains a non-declared throwable", 
  +                            (Throwable) fault);
  +                    } else {
  +                        throw new WSIFException(
  +                            "Operation failed and a non-throwable fault message 
part was returned: "
  +                                + fault);
  +                    }
                   }
  -                throw new WSIFException(sb.toString());
  +                throw new WSIFException("Operation failed but returned fault 
message contained no part");
               }
           }
   
  @@ -326,8 +332,8 @@
               List outputParts = outputMessage.getOrderedParts(null);
               if (outputParts != null && outputParts.size() > 0) {
                   if (usingwrapped || isWrappedInContext()) {
  -                     unwrap(operation.getName()+"Response", outputParts);
  -                } 
  +                    unwrap(operation.getName() + "Response", outputParts);
  +                }
   
                   // The return value is always the first output part
                   Iterator outPartIt = outputParts.iterator();
  @@ -341,7 +347,9 @@
                           inputMessage.getOrderedParts(null).toArray();
                       Part nextOutPart = (Part) outPartIt.next();
   
  -                    for (int argIndex = 0; argIndex < args.length; argIndex++) {
  +                    for (int argIndex = 0;
  +                        argIndex < args.length;
  +                        argIndex++) {
                           if (((Part) (inPartArr[argIndex]))
                               .getName()
                               .equals(nextOutPart.getName())) {
  
  
  

Reply via email to