You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2005/07/31 13:37:18 UTC

svn commit: r226629 - /jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java

Author: rdonkin
Date: Sun Jul 31 04:37:15 2005
New Revision: 226629

URL: http://svn.apache.org/viewcvs?rev=226629&view=rev
Log:
Added support for map updater specified in dot betwixt file. Unfortunately also reformatted class and so stuffed the diffs :( Thanks to Glenn Goldenberg for suggesting these changes.

Modified:
    jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java

Modified: jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java?rev=226629&r1=226628&r2=226629&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/digester/ElementRule.java Sun Jul 31 04:37:15 2005
@@ -1,6 +1,7 @@
 package org.apache.commons.betwixt.digester;
+
 /*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +14,7 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */ 
+ */
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -31,20 +32,24 @@
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
-/** 
-  * <p><code>ElementRule</code> the digester Rule for parsing 
-  * the &lt;element&gt; elements.</p>
-  *
-  * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
-  */
+/**
+ * <p>
+ * <code>ElementRule</code> the digester Rule for parsing the &lt;element&gt;
+ * elements.
+ * </p>
+ * 
+ * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
+ */
 public class ElementRule extends MappedPropertyRule {
 
     /** Logger */
-    private static Log log = LogFactory.getLog( ElementRule.class );
-    /** 
-     * Sets the log for this class 
+    private static Log log = LogFactory.getLog(ElementRule.class);
+
+    /**
+     * Sets the log for this class
      * 
-     * @param newLog the new Log implementation for this class to use
+     * @param newLog
+     *            the new Log implementation for this class to use
      * @since 0.5
      */
     public static final void setLog(Log newLog) {
@@ -53,125 +58,137 @@
 
     /** Class for which the .bewixt file is being digested */
     private Class beanClass;
+
     /** Base constructor */
-    public ElementRule() {}
-    
+    public ElementRule() {
+    }
+
     // Rule interface
-    //-------------------------------------------------------------------------    
-    
+    // -------------------------------------------------------------------------
+
     /**
      * Process the beginning of this element.
-     *
-     * @param attributes The attribute list of this element
-     * @throws SAXException 1. If this tag's parent is not either an info or element tag.
-     * 2. If the name attribute is not valid XML element name.
-     * 3. If the name attribute is not present 
-     * 4. If the class attribute is not a loadable (fully qualified) class name
+     * 
+     * @param attributes
+     *            The attribute list of this element
+     * @throws SAXException
+     *             1. If this tag's parent is not either an info or element tag.
+     *             2. If the name attribute is not valid XML element name. 3. If
+     *             the name attribute is not present 4. If the class attribute
+     *             is not a loadable (fully qualified) class name
      */
-    public void begin(String name, String namespace, Attributes attributes) throws SAXException {
-        String nameAttributeValue = attributes.getValue( "name" );
-        
+    public void begin(String name, String namespace, Attributes attributes)
+            throws SAXException {
+        String nameAttributeValue = attributes.getValue("name");
+
         ElementDescriptor descriptor = new ElementDescriptor();
-        descriptor.setLocalName( nameAttributeValue );
-        String uri = attributes.getValue( "uri" );
+        descriptor.setLocalName(nameAttributeValue);
+        String uri = attributes.getValue("uri");
         String qName = nameAttributeValue;
-        if ( uri != null && nameAttributeValue != null) {
-            descriptor.setURI( uri );  
-            String prefix = getXMLIntrospector().getConfiguration().getPrefixMapper().getPrefix(uri);
+        if (uri != null && nameAttributeValue != null) {
+            descriptor.setURI(uri);
+            String prefix = getXMLIntrospector().getConfiguration()
+                    .getPrefixMapper().getPrefix(uri);
             qName = prefix + ":" + nameAttributeValue;
         }
-        descriptor.setQualifiedName( qName );
-        
-        String propertyName = attributes.getValue( "property" );
-        descriptor.setPropertyName( propertyName );
-        
-        String propertyType = attributes.getValue( "type" );
-        
+        descriptor.setQualifiedName(qName);
+
+        String propertyName = attributes.getValue("property");
+        descriptor.setPropertyName(propertyName);
+
+        String propertyType = attributes.getValue("type");
+
         if (log.isTraceEnabled()) {
-            log.trace(
-                    "(BEGIN) name=" + nameAttributeValue + " uri=" + uri 
+            log.trace("(BEGIN) name=" + nameAttributeValue + " uri=" + uri
                     + " property=" + propertyName + " type=" + propertyType);
         }
-        
+
         // set mapping derivation
-        String mappingDerivation = attributes.getValue( "mappingDerivation" );
-        if ( "introspection".equals(mappingDerivation) ) {
-            descriptor.setUseBindTimeTypeForMapping( false );
-        } else if ( "bind".equals(mappingDerivation) ) {
-            descriptor.setUseBindTimeTypeForMapping( true );
+        String mappingDerivation = attributes.getValue("mappingDerivation");
+        if ("introspection".equals(mappingDerivation)) {
+            descriptor.setUseBindTimeTypeForMapping(false);
+        } else if ("bind".equals(mappingDerivation)) {
+            descriptor.setUseBindTimeTypeForMapping(true);
         }
-        
+
         // set the property type using reflection
-        descriptor.setPropertyType( 
-            getPropertyType( propertyType, beanClass, propertyName ) 
-        );
-        
+        descriptor.setPropertyType(getPropertyType(propertyType, beanClass,
+                propertyName));
+
         boolean isCollective = getXMLIntrospector().getConfiguration()
-        .isLoopType(descriptor.getPropertyType());
-        
+                .isLoopType(descriptor.getPropertyType());
+
         descriptor.setCollective(isCollective);
-        
-        // check that the name attribute is present 
-        if ( !isCollective && (nameAttributeValue == null || nameAttributeValue.trim().equals( "" ) )) {
+
+        // check that the name attribute is present
+        if (!isCollective
+                && (nameAttributeValue == null || nameAttributeValue.trim()
+                        .equals(""))) {
             // allow polymorphic mappings but log note for user
-            log.info("No name attribute has been specified. This element will be polymorphic.");
+            log
+                    .info("No name attribute has been specified. This element will be polymorphic.");
+        }
+
+        // check that name is well formed
+        if (nameAttributeValue != null
+                && !XMLUtils.isWellFormedXMLName(nameAttributeValue)) {
+            throw new SAXException("'" + nameAttributeValue
+                    + "' would not be a well formed xml element name.");
         }
-        
-        // check that name is well formed 
-        if ( nameAttributeValue != null && !XMLUtils.isWellFormedXMLName( nameAttributeValue ) ) {
-            throw new SAXException("'" + nameAttributeValue + "' would not be a well formed xml element name.");
-        }
-        
-        
-        String implementationClass = attributes.getValue( "class" );
-        if ( log.isTraceEnabled() ) {
+
+        String implementationClass = attributes.getValue("class");
+        if (log.isTraceEnabled()) {
             log.trace("'class' attribute=" + implementationClass);
         }
-        if ( implementationClass != null ) {
+        if (implementationClass != null) {
             try {
-                
+
                 Class clazz = Class.forName(implementationClass);
-                descriptor.setImplementationClass( clazz );
-                
-            } catch (Exception e)  {
-                if ( log.isDebugEnabled() ) {
-                    log.debug("Cannot load class named: " + implementationClass, e);
+                descriptor.setImplementationClass(clazz);
+
+            } catch (Exception e) {
+                if (log.isDebugEnabled()) {
+                    log.debug(
+                            "Cannot load class named: " + implementationClass,
+                            e);
                 }
-                throw new SAXException("Cannot load class named: " + implementationClass);
+                throw new SAXException("Cannot load class named: "
+                        + implementationClass);
             }
         }
-        
-        if ( propertyName != null && propertyName.length() > 0 ) {
-            boolean forceAccessible = "true".equals(attributes.getValue("forceAccessible"));
-            configureDescriptor(descriptor, attributes.getValue("updater"), forceAccessible);
-            
+
+        if (propertyName != null && propertyName.length() > 0) {
+            boolean forceAccessible = "true".equals(attributes
+                    .getValue("forceAccessible"));
+            configureDescriptor(descriptor, attributes.getValue("updater"),
+                    forceAccessible);
+
         } else {
-            String value = attributes.getValue( "value" );
-            if ( value != null ) {
-                descriptor.setTextExpression( new ConstantExpression( value ) );
+            String value = attributes.getValue("value");
+            if (value != null) {
+                descriptor.setTextExpression(new ConstantExpression(value));
             }
         }
-        
+
         Object top = digester.peek();
-        if ( top instanceof XMLBeanInfo ) {
+        if (top instanceof XMLBeanInfo) {
             XMLBeanInfo beanInfo = (XMLBeanInfo) top;
-            beanInfo.setElementDescriptor( descriptor );
+            beanInfo.setElementDescriptor(descriptor);
             beanClass = beanInfo.getBeanClass();
-            descriptor.setPropertyType( beanClass );
-            
-        } else if ( top instanceof ElementDescriptor ) {
+            descriptor.setPropertyType(beanClass);
+
+        } else if (top instanceof ElementDescriptor) {
             ElementDescriptor parent = (ElementDescriptor) top;
-            parent.addElementDescriptor( descriptor );
-            
+            parent.addElementDescriptor(descriptor);
+
         } else {
-            throw new SAXException( "Invalid use of <element>. It should " 
-                + "be nested inside <info> or other <element> nodes" );
+            throw new SAXException("Invalid use of <element>. It should "
+                    + "be nested inside <info> or other <element> nodes");
         }
 
-        digester.push(descriptor);        
+        digester.push(descriptor);
     }
 
-
     /**
      * Process the end of this element.
      */
@@ -179,204 +196,229 @@
         Object top = digester.pop();
     }
 
-    
     // Implementation methods
-    //-------------------------------------------------------------------------    
-    
-    /** 
-     * Sets the Expression and Updater from a bean property name 
-     * Uses the default updater (from the standard java bean property).
-     *
-     * @param elementDescriptor configure this <code>ElementDescriptor</code>
+    // -------------------------------------------------------------------------
+
+    /**
+     * Sets the Expression and Updater from a bean property name Uses the
+     * default updater (from the standard java bean property).
+     * 
+     * @param elementDescriptor
+     *            configure this <code>ElementDescriptor</code>
      * @since 0.5
      */
     protected void configureDescriptor(ElementDescriptor elementDescriptor) {
-        configureDescriptor( elementDescriptor, null );
-    }       
-    
-    /** 
-     * Sets the Expression and Updater from a bean property name 
-     * Allows a custom updater to be passed in.
-     *
-     * @param elementDescriptor configure this <code>ElementDescriptor</code>
-     * @param updateMethodName custom update method. If null, then use standard
+        configureDescriptor(elementDescriptor, null);
+    }
+
+    /**
+     * Sets the Expression and Updater from a bean property name Allows a custom
+     * updater to be passed in.
+     * 
+     * @param elementDescriptor
+     *            configure this <code>ElementDescriptor</code>
+     * @param updateMethodName
+     *            custom update method. If null, then use standard
      * @since 0.5
-     * @deprecated now calls <code>#configureDescriptor(ElementDescriptor, String, boolean)</code>
-     * which allow accessibility to be forced. 
-     * The subclassing API was not really considered carefully when 
-     * this class was created. 
-     * If anyone subclasses this method please contact the mailing list
-     * and suitable hooks will be placed into the code. 
+     * @deprecated now calls
+     *             <code>#configureDescriptor(ElementDescriptor, String, boolean)</code>
+     *             which allow accessibility to be forced. The subclassing API
+     *             was not really considered carefully when this class was
+     *             created. If anyone subclasses this method please contact the
+     *             mailing list and suitable hooks will be placed into the code.
      */
-    protected void configureDescriptor(
-                                        ElementDescriptor elementDescriptor,
-                                        String updateMethodName) {
-        configureDescriptor( elementDescriptor, null, false );
+    protected void configureDescriptor(ElementDescriptor elementDescriptor,
+            String updateMethodName) {
+        configureDescriptor(elementDescriptor, null, false);
     }
-        
-    /** 
-     * Sets the Expression and Updater from a bean property name 
-     * Allows a custom updater to be passed in.
-     *
-     * @param elementDescriptor configure this <code>ElementDescriptor</code>
-     * @param updateMethodName custom update method. If null, then use standard
-     * @param forceAccessible if true and updateMethodName is not null, 
-     * then non-public methods will be searched and made accessible (Method.setAccessible(true))
+
+    /**
+     * Sets the Expression and Updater from a bean property name Allows a custom
+     * updater to be passed in.
+     * 
+     * @param elementDescriptor
+     *            configure this <code>ElementDescriptor</code>
+     * @param updateMethodName
+     *            custom update method. If null, then use standard
+     * @param forceAccessible
+     *            if true and updateMethodName is not null, then non-public
+     *            methods will be searched and made accessible
+     *            (Method.setAccessible(true))
      */
-    private void configureDescriptor(
-                                        ElementDescriptor elementDescriptor,
-                                        String updateMethodName,
-                                        boolean forceAccessible) {
+    private void configureDescriptor(ElementDescriptor elementDescriptor,
+            String updateMethodName, boolean forceAccessible) {
         Class beanClass = getBeanClass();
-        if ( beanClass != null ) {
+        if (beanClass != null) {
             String name = elementDescriptor.getPropertyName();
-            PropertyDescriptor descriptor = 
-                getPropertyDescriptor( beanClass, name );
-            
-            if ( descriptor != null ) { 
-                configureProperty( 
-                                        elementDescriptor, 
-                                        descriptor, 
-                                        updateMethodName, 
-                                        forceAccessible,
-                                        beanClass );
-                
-                getProcessedPropertyNameSet().add( name );
+            PropertyDescriptor descriptor = getPropertyDescriptor(beanClass,
+                    name);
+
+            if (descriptor != null) {
+                configureProperty(elementDescriptor, descriptor,
+                        updateMethodName, forceAccessible, beanClass);
+
+                getProcessedPropertyNameSet().add(name);
             }
         }
-    }  
-    
-                                    
+    }
+
     /**
-     * Configure an <code>ElementDescriptor</code> from a <code>PropertyDescriptor</code>.
-     * A custom update method may be set.
-     *
-     * @param elementDescriptor configure this <code>ElementDescriptor</code>
-     * @param propertyDescriptor configure from this <code>PropertyDescriptor</code>
-     * @param updateMethodName the name of the custom updater method to user. 
-     * If null, then then 
-     * @param forceAccessible if true and updateMethodName is not null, then non-public methods will be searched and made accessible (Method.setAccessible(true))
-     * @param beanClass the <code>Class</code> from which the update method should be found.
-     * This may be null only when <code>updateMethodName</code> is also null.
+     * Configure an <code>ElementDescriptor</code> from a
+     * <code>PropertyDescriptor</code>. A custom update method may be set.
+     * 
+     * @param elementDescriptor
+     *            configure this <code>ElementDescriptor</code>
+     * @param propertyDescriptor
+     *            configure from this <code>PropertyDescriptor</code>
+     * @param updateMethodName
+     *            the name of the custom updater method to user. If null, then
+     *            then
+     * @param forceAccessible
+     *            if true and updateMethodName is not null, then non-public
+     *            methods will be searched and made accessible
+     *            (Method.setAccessible(true))
+     * @param beanClass
+     *            the <code>Class</code> from which the update method should
+     *            be found. This may be null only when
+     *            <code>updateMethodName</code> is also null.
      */
-    private void configureProperty( 
-                                    ElementDescriptor elementDescriptor, 
-                                    PropertyDescriptor propertyDescriptor,
-                                    String updateMethodName,
-                                    boolean forceAccessible,
-                                    Class beanClass ) {
-        
+    private void configureProperty(ElementDescriptor elementDescriptor,
+            PropertyDescriptor propertyDescriptor, String updateMethodName,
+            boolean forceAccessible, Class beanClass) {
+
         Class type = propertyDescriptor.getPropertyType();
         Method readMethod = propertyDescriptor.getReadMethod();
         Method writeMethod = propertyDescriptor.getWriteMethod();
-        
-        elementDescriptor.setPropertyType( type );        
-        
+
+        elementDescriptor.setPropertyType(type);
+
         // TODO: associate more bean information with the descriptor?
-        //nodeDescriptor.setDisplayName( propertyDescriptor.getDisplayName() );
-        //nodeDescriptor.setShortDescription( propertyDescriptor.getShortDescription() );
-        
-        if ( readMethod == null ) {
-            log.trace( "No read method" );
+        // nodeDescriptor.setDisplayName( propertyDescriptor.getDisplayName() );
+        // nodeDescriptor.setShortDescription(
+        // propertyDescriptor.getShortDescription() );
+
+        if (readMethod == null) {
+            log.trace("No read method");
             return;
         }
-        
-        if ( log.isTraceEnabled() ) {
-            log.trace( "Read method=" + readMethod.getName() );
+
+        if (log.isTraceEnabled()) {
+            log.trace("Read method=" + readMethod.getName());
         }
-        
+
         // choose response from property type
 
-        if ( getXMLIntrospector().isPrimitiveType( type ) ) {
-            elementDescriptor.setTextExpression( new MethodExpression( readMethod ) );
-            
-        } else if ( getXMLIntrospector().isLoopType( type ) ) {
+        if (getXMLIntrospector().isPrimitiveType(type)) {
+            elementDescriptor
+                    .setTextExpression(new MethodExpression(readMethod));
+
+        } else if (getXMLIntrospector().isLoopType(type)) {
             log.trace("Loop type ??");
-            
-            // don't wrap this in an extra element as its specified in the 
-            // XML descriptor so no need.            
-            elementDescriptor.setContextExpression(
-                new IteratorExpression( new MethodExpression( readMethod ) )
-            );
+
+            // don't wrap this in an extra element as its specified in the
+            // XML descriptor so no need.
+            elementDescriptor.setContextExpression(new IteratorExpression(
+                    new MethodExpression(readMethod)));
             elementDescriptor.setHollow(true);
 
             writeMethod = null;
-            
+
             if (Map.class.isAssignableFrom(type)) {
-                elementDescriptor.setLocalName( "entry" );
+                elementDescriptor.setLocalName("entry");
                 // add elements for reading
-                ElementDescriptor keyDescriptor = new ElementDescriptor( "key" );
-                keyDescriptor.setHollow( true );
-                elementDescriptor.addElementDescriptor( keyDescriptor );
-            
-                ElementDescriptor valueDescriptor = new ElementDescriptor( "value" );
-                valueDescriptor.setHollow( true );
-                elementDescriptor.addElementDescriptor( valueDescriptor );
+                ElementDescriptor keyDescriptor = new ElementDescriptor("key");
+                keyDescriptor.setHollow(true);
+                elementDescriptor.addElementDescriptor(keyDescriptor);
+
+                ElementDescriptor valueDescriptor = new ElementDescriptor(
+                        "value");
+                valueDescriptor.setHollow(true);
+                elementDescriptor.addElementDescriptor(valueDescriptor);
             }
-            
+
         } else {
-            log.trace( "Standard property" );
+            log.trace("Standard property");
             elementDescriptor.setHollow(true);
-            elementDescriptor.setContextExpression( new MethodExpression( readMethod ) );
+            elementDescriptor.setContextExpression(new MethodExpression(
+                    readMethod));
         }
-    
+
         // see if we have a custom method update name
         if (updateMethodName == null) {
             // set standard write method
-            if ( writeMethod != null ) {
-                elementDescriptor.setUpdater( new MethodUpdater( writeMethod ) );
+            if (writeMethod != null) {
+                elementDescriptor.setUpdater(new MethodUpdater(writeMethod));
             }
-            
+
         } else {
             // see if we can find and set the custom method
-            if ( log.isTraceEnabled() ) {
-                log.trace( "Finding custom method: " );
-                log.trace( "  on:" + beanClass );
-                log.trace( "  name:" + updateMethodName );
+            if (log.isTraceEnabled()) {
+                log.trace("Finding custom method: ");
+                log.trace("  on:" + beanClass);
+                log.trace("  name:" + updateMethodName);
             }
-            
+
             Method updateMethod;
-            if ( forceAccessible ) {
-                updateMethod = findAnyMethod( updateMethodName, beanClass );
+            boolean isMapTypeProperty = Map.class.isAssignableFrom(type);
+            if (forceAccessible) {
+                updateMethod = findAnyMethod(updateMethodName, beanClass, isMapTypeProperty);
             } else {
-                updateMethod = findPublicMethod( updateMethodName, beanClass );
+                updateMethod = findPublicMethod(updateMethodName, beanClass, isMapTypeProperty);
             }
-            
+
             if (updateMethod == null) {
-                if ( log.isInfoEnabled() ) {
-                    
-                    log.info("No method with name '" + updateMethodName + "' found for update");
+                if (log.isInfoEnabled()) {
+
+                    log.info("No method with name '" + updateMethodName
+                            + "' found for update");
                 }
             } else {
-    
-                elementDescriptor.setUpdater( new MethodUpdater( updateMethod ) );
-                elementDescriptor.setSingularPropertyType( updateMethod.getParameterTypes()[0] );
-                if ( log.isTraceEnabled() ) {
-                    log.trace( "Set custom updater on " + elementDescriptor);
+                // assign updater to elementDescriptor
+                if (Map.class.isAssignableFrom(type)) {
+                    
+                    getXMLIntrospector().assignAdder(updateMethod, elementDescriptor);
+
+                } else {
+                    elementDescriptor
+                            .setUpdater(new MethodUpdater(updateMethod));
+                    elementDescriptor.setSingularPropertyType(updateMethod
+                            .getParameterTypes()[0]);
+                    if (log.isTraceEnabled()) {
+                        log.trace("Set custom updater on " + elementDescriptor);
+                    }
                 }
             }
         }
     }
 
-    private Method findPublicMethod(String updateMethodName, Class beanType) {
+    private Method findPublicMethod(String updateMethodName, Class beanType, boolean isMapTypeProperty) {
         Method[] methods = beanType.getMethods();
-        Method updateMethod = searchMethodsForMatch( updateMethodName, methods );
+        Method updateMethod = searchMethodsForMatch(updateMethodName, methods, isMapTypeProperty);
         return updateMethod;
     }
 
-    private Method searchMethodsForMatch(String updateMethodName, Method[] methods) {
+    private Method searchMethodsForMatch(String updateMethodName,
+            Method[] methods, boolean isMapType) {
         Method updateMethod = null;
-        for ( int i = 0, size = methods.length; i < size; i++ ) {
+        for (int i = 0, size = methods.length; i < size; i++) {
             Method method = methods[i];
-            if ( updateMethodName.equals( method.getName() ) ) {
+            if (updateMethodName.equals(method.getName())) {
+
+                // updater should have one parameter unless type is Map
+                int numParams = 1;
+                if (isMapType) {
+                    // updater for Map should have two parameters
+                    numParams = 2;
+                }
+
                 // we have a matching name
                 // check paramters are correct
-                if (methods[i].getParameterTypes().length == 1) {
+                if (methods[i].getParameterTypes().length == numParams) {
                     // we'll use first match
                     updateMethod = methods[i];
-                    if ( log.isTraceEnabled() ) {
+                    if (log.isTraceEnabled()) {
                         log.trace("Matched method:" + updateMethod);
-                    } 
+                    }
                     // done since we're using the first match
                     break;
                 }
@@ -385,7 +427,7 @@
         return updateMethod;
     }
 
-    private Method findAnyMethod(String updateMethodName, Class beanType) {
+    private Method findAnyMethod(String updateMethodName, Class beanType, boolean isMapTypeProperty) {
         // TODO: suspect that this algorithm may run into difficulties
         // on older JVMs (particularly with package privilage interfaces).
         // This seems like too esoteric a use case to worry to much about now
@@ -393,15 +435,17 @@
         Class classToTry = beanType;
         do {
             Method[] methods = classToTry.getDeclaredMethods();
-            updateMethod = searchMethodsForMatch(updateMethodName, methods);
+            updateMethod = searchMethodsForMatch(updateMethodName, methods, isMapTypeProperty);
 
-            //try next superclass - Object will return null and end loop if no method is found
+            // try next superclass - Object will return null and end loop if no
+            // method is found
             classToTry = classToTry.getSuperclass();
-        } while ( updateMethod == null && classToTry != null );
+        } while (updateMethod == null && classToTry != null);
 
-        if ( updateMethod != null ) {
-            boolean isPublic = Modifier.isPublic(updateMethod.getModifiers()) && Modifier.isPublic(beanType.getModifiers());
-            if ( !isPublic ) {
+        if (updateMethod != null) {
+            boolean isPublic = Modifier.isPublic(updateMethod.getModifiers())
+                    && Modifier.isPublic(beanType.getModifiers());
+            if (!isPublic) {
                 updateMethod.setAccessible(true);
             }
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org