dims        2002/09/20 07:29:52

  Modified:    java/src/org/apache/axis/utils/bytecode
                        ParamNameExtractor.java
               java/src/org/apache/axis/description ServiceDesc.java
  Log:
  Fix for Bug 12853 - ArrayIndexOutOfBoundsException caused by utils.bytecode
  
  Notes:
  - Remove the cache from ParamNameExtractor as it is NEVER cleaned up.
  - ParamNameExtractor is now stateless, so there should not be problems caused by 
multiple threads...
  - Add a cache to ServiceDesc itself
  - Add a synchronized block around this cache.
  - Since the cache is in ServiceDesc, it should theoretically get cleaned up when 
this ServiceDesc goes out of scope...
  
  Revision  Changes    Path
  1.5       +11 -30    
xml-axis/java/src/org/apache/axis/utils/bytecode/ParamNameExtractor.java
  
  Index: ParamNameExtractor.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/utils/bytecode/ParamNameExtractor.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ParamNameExtractor.java   18 Sep 2002 16:10:43 -0000      1.4
  +++ ParamNameExtractor.java   20 Sep 2002 14:29:52 -0000      1.5
  @@ -75,14 +75,6 @@
               LogFactory.getLog(ParamNameExtractor.class.getName());
   
       /**
  -     * Cache of ParamReader objects which correspond to particular
  -     * Java classes.
  -     *
  -     * !!! NOTE : AT PRESENT WE DO NOT CLEAN UP THIS CACHE.
  -     */
  -    private static Hashtable paramCache = new Hashtable();
  -
  -    /**
        * Retrieve a list of function parameter names from a method
        * Returns null if unable to read parameter names (i.e. bytecode not
        * built with debug).
  @@ -95,27 +87,16 @@
   
           // get declaring class
           Class c = method.getDeclaringClass();
  -        
  -        // Try to obtain a ParamReader class object from cache
  -        ParamReader pr = (ParamReader) paramCache.get(c);
  -
  -        if (pr == null) {
  -            try {
  -                // get a parameter reader
  -                pr = new ParamReader(c);
  -                // cache it
  -                paramCache.put(c, pr);
  -            } catch (IOException e) {
  -                // log it and leave
  -                log.info(Messages.getMessage("error00") + ":" + e);
  -                return null;
  -            }
  +        try {
  +            // get a parameter reader
  +            ParamReader pr = new ParamReader(c);
  +            // get the paramter names
  +            String[] names = pr.getParameterNames(method);
  +            return names;
  +        } catch (IOException e) {
  +            // log it and leave
  +            log.info(Messages.getMessage("error00") + ":" + e);
  +            return null;
           }
  -
  -        // get the paramter names
  -        String[] names = pr.getParameterNames(method);
  -
  -        return names;
       }
  -}
  -
  +}
  \ No newline at end of file
  
  
  
  1.57      +13 -2     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.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- ServiceDesc.java  20 Sep 2002 14:06:52 -0000      1.56
  +++ ServiceDesc.java  20 Sep 2002 14:29:52 -0000      1.57
  @@ -154,6 +154,7 @@
       private HashMap name2OperationsMap = null;
       private HashMap qname2OperationsMap = null;
       private HashMap method2OperationMap = new HashMap();
  +    private HashMap method2ParamsMap = new HashMap();
   
       /** Method names for which we have completed any introspection necessary */
       private ArrayList completedNames = new ArrayList();
  @@ -959,8 +960,7 @@
           operation.setReturnClass(retClass);
           operation.setReturnType(tm.getTypeQName(method.getReturnType()));
   
  -        String [] paramNames =
  -                ParamNameExtractor.getParameterNamesFromDebugInfo(method);
  +        String [] paramNames = getParamNames(method);
   
           for (int k = 0; k < paramTypes.length; k++) {
               Class type = paramTypes[k];
  @@ -1058,6 +1058,17 @@
   
           addOperationDesc(operation);
           method2OperationMap.put(method, operation);
  +    }
  +
  +    private String[] getParamNames(Method method) {
  +        synchronized (method2ParamsMap) {
  +            String [] paramNames = (String []) method2ParamsMap.get(method);
  +            if(paramNames != null)
  +                return paramNames;
  +            paramNames = ParamNameExtractor.getParameterNamesFromDebugInfo(method);
  +            method2ParamsMap.put(method, paramNames);
  +            return paramNames;
  +        }
       }
   
       public void setNamespaceMappings(List namespaces) {
  
  
  


Reply via email to