gdaniels    2003/01/01 09:45:52

  Modified:    java/src/org/apache/axis/description ServiceDesc.java
  Log:
  Fix bugs:
  
  http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13146
  http://nagoya.apache.org/bugzilla/show_bug.cgi?id=11766
  
  Be more careful about matching overloaded methods with operations.
  Now if we find a method which works, but only by using conversion,
  we continue scanning to try and find a better match.  This seems to
  clear up the overloaded WSDL generation problems that James Black
  was seeing, and since we only need to do it once, the performance hit
  won't be very noticeable.
  
  Revision  Changes    Path
  1.70      +40 -17    xml-axis/java/src/org/apache/axis/description/ServiceDesc.java
  
  Index: ServiceDesc.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/ServiceDesc.java,v
  retrieving revision 1.69
  retrieving revision 1.70
  diff -u -r1.69 -r1.70
  --- ServiceDesc.java  11 Dec 2002 22:38:13 -0000      1.69
  +++ ServiceDesc.java  1 Jan 2003 17:45:52 -0000       1.70
  @@ -597,11 +597,16 @@
               return;
   
           // Find the method.  We do this once for each Operation.
  +        
           Method [] methods = implClass.getDeclaredMethods();
  +        // A place to keep track of possible matches
  +        Method possibleMatch = null;
  +        
           for (int i = 0; i < methods.length; i++) {
               Method method = methods[i];
               if (Modifier.isPublic(method.getModifiers()) &&
  -                    method.getName().equals(oper.getName())) {
  +                    method.getName().equals(oper.getName()) &&
  +                    method2OperationMap.get(method) == null) {
   
                   if (style == Style.MESSAGE) {
                       int messageOperType = checkMessageMethod(method);
  @@ -618,23 +623,24 @@
                       continue;
   
                   int j;
  +                boolean conversionNecessary = false;
                   for (j = 0; j < paramTypes.length; j++) {
                       Class type = paramTypes[j];
  -                    Class heldType = type;
  +                    Class actualType = type;
                       if (Holder.class.isAssignableFrom(type)) {
  -                        heldType = JavaUtils.getHolderValueType(type);
  +                        actualType = JavaUtils.getHolderValueType(type);
                       }
                       ParameterDesc param = oper.getParameter(j);
                       QName typeQName = param.getTypeQName();
                       if (typeQName == null) {
                           // No typeQName is available.  Set it using
  -                        // information from the held type.
  +                        // information from the actual type.
                           // (Scenarios B and D)
                           // There is no need to try and match with
                           // the Method parameter javaType because
                           // the ParameterDesc is being constructed
                           // by introspecting the Method.
  -                        typeQName = tm.getTypeQName(heldType);
  +                        typeQName = tm.getTypeQName(actualType);
                           param.setTypeQName(typeQName);
                       } else {
                           // A type qname is available.
  @@ -655,9 +661,14 @@
                           // This is a match if the paramClass is somehow
                           // convertable to the "real" parameter type.  If not,
                           // break out of this loop.
  -                        if (!JavaUtils.isConvertable(paramClass, heldType)) {
  +                        if (!JavaUtils.isConvertable(paramClass, actualType)) {
                               break;
                           }
  +                        
  +                        if (!actualType.isAssignableFrom(paramClass)) {
  +                            // This doesn't fit without conversion
  +                            conversionNecessary = true;
  +                        }
                       }
                       // In all scenarios the ParameterDesc javaType is set to
                       // match the javaType in the corresponding parameter.
  @@ -669,20 +680,32 @@
                       // failed.
                       continue;
                   }
  +                
  +                // This is our latest possibility
  +                possibleMatch = method;
   
  -                oper.setReturnClass(method.getReturnType());
  +                // If this is exactly it, stop now.  Otherwise keep looking
  +                // just in case we find a better match.
  +                if (!conversionNecessary) {
  +                    break;
  +                }
   
  -                // Do the faults
  -                createFaultMetadata(method, oper);
  -                
  -                // At some point we might want to check here to see if this
  -                // Method is already associated with another Operation, but
  -                // this doesn't seem critital.
  -
  -                oper.setMethod(method);
  -                method2OperationMap.put(method, oper);
  -                return;
               }
  +        }
  +
  +        // At this point, we may or may not have a possible match.
  +        // FIXME : Should we prefer an exact match from a base class over
  +        //         a with-conversion match from the target class?  If so,
  +        //         we'll need to change the logic below.
  +        if (possibleMatch != null) {
  +            oper.setReturnClass(possibleMatch.getReturnType());
  +
  +            // Do the faults
  +            createFaultMetadata(possibleMatch, oper);
  +                
  +            oper.setMethod(possibleMatch);
  +            method2OperationMap.put(possibleMatch, oper);
  +            return;
           }
   
           // Didn't find a match.  Try the superclass, if appropriate
  
  
  


Reply via email to