harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kevin Zhou" <zhoukevi...@gmail.com>
Subject Re: struts test suite is breaking
Date Tue, 09 Dec 2008 06:59:25 GMT
Thereinto, StandBeanInfo.mergeProps method is used to merge the
PropertyDescriptor with superclass.
The "superType" is the type of one of its super classes's propreties.

On Tue, Dec 9, 2008 at 2:53 PM, Kevin Zhou <zhoukevin83@gmail.com> wrote:

> From the trace, the NPE is thrown from StandBeanInfo.mergeProps() (line
> 295):
> if (subType != null &&subType.getName().equals(superType.getName())) {
> //295
> ...
> }
> where "superType" may be null.
> Next Action: Will Construct test framework for this, and check whether this
> is the root cause for this defect.
>
>
> On Tue, Dec 9, 2008 at 2:17 PM, chunrong lai <chunronglai@gmail.com>wrote:
>
>>
>> hi, colleagues:
>>     Sorry for the late report. But I see that the struts test suite is
>> breaking due to r647921 with below stackTrace:
>>
>> Caused by: java.lang.NullPointerException
>>         at
>> java.beans.StandardBeanInfo.mergeProps(StandardBeanInfo.java:295)
>>         at
>> java.beans.StandardBeanInfo.mergeBeanInfo(StandardBeanInfo.java:209)
>>         at java.beans.Introspector.getBeanInfoImpl(Introspector.java:282)
>>         at
>> java.beans.Introspector.getBeanInfoImplAndInit(Introspector.java:347)
>>         at java.beans.Introspector.getBeanInfo(Introspector.java:162)
>>         at
>> freemarker.ext.beans.BeansWrapper.populateClassMapWithBeanInfo(BeansW
>> rapper.java:844)
>>         ... 52 more
>>
>>      To reproduce the error one needs to (reproducible in windows and
>> Linux platforms)
>>      (1) Start a webserver
>>      (1.1) Extract apache-tomcat-6.0.18.tar.gz  from (
>> http://tomcat.apache.org/download-60.cgi) and cd the extracted directory
>> "apache-tomcat-6.0.18".
>>      (1.2) Create apache-tomcat-6.0.18/my_base,
>> apache-tomcat-6.0.18/struts_test, apache-tomcat-6.0.18/struts_test/logs,
>> apache-tomcat-6.0.18/struts_test/temp,
>> apache-tomcat-6.0.18/struts_test/webapps/,
>> apache-tomcat-6.0.18/struts_test/work,
>>      (1.3) Copy struts2-showcase-2.0.6.war  (in
>> struts-2.0.6-all/apps/ extracted from
>> http://archive.apache.org/dist/struts/binaries/struts-2.0.6-all.zip) to
>> apache-tomcat-6.0.18/struts_test, copy apache-tomcat-6.0.18/conf to
>> apache-tomcat-6.0.18/struts_test
>>      (1.4) set
>> CATALINA_BASE=…./apache-tomcat-6.0.18/my_base/struts_test, set
>> JRE_HOME=......
>>      (1.5) cd …./apache-tomcat-6.0.18/, $bin/catalina.sh run (or
>> catalina.bat for windows platform)
>>
>>      (2) Run the attached test case seperatedly
>>      (2.1) Unzip the htmlunit-2.3.zip from
>> http://sourceforge.net/project/showfiles.php?group_id=47038 and include
>> the jar files from "htmlunit-2.3/lib into CLASSPATH
>>      (2.2) Compile and run the attached test case (also listed below),
>> check the content of the result named debug.html to see the reported
>> exception
>>
>> import java.io.*;
>> import java.net.URL;
>> import java.lang.Thread;
>> import java.util.*;
>> import java.io.FileOutputStream;
>> import com.gargoylesoftware.htmlunit.WebClient;
>> import com.gargoylesoftware.htmlunit.html.HtmlPage;
>>
>> public class struts_test_debug{
>>   public static void test_1(){
>>     try{
>>        URL baseurl=new URL("http://localhost:8080");
>>        String p = "/struts2-showcase-2.0.6/tags/non-ui/debug.jsp";
>>        final WebClient webClient = new WebClient();
>>        final HtmlPage page = (HtmlPage)webClient.getPage(new
>> URL(baseurl,p));
>>        //get the source code of webpage
>>        String pHtml = page.getWebResponse().getContentAsString();
>>        writeFile(pHtml);
>>        System.out.println("Generated file:  'Debug.html'  in local");
>>     }catch(Exception e){}
>>    }
>>
>>    public static void main(String args[]){
>>      System.out.println("test start!");
>>      System.out.println("Reading remote file ...");
>>      test_1();
>>      System.out.println("test finished!");
>>    }
>>    public static void writeFile(String pHtml){
>>      try{
>>        FileOutputStream out = new FileOutputStream("Debug.html",false);
>>        out.write(pHtml.getBytes());
>>      }catch(Exception e){}
>>    }
>> }
>>
>>
>>   From a...@apache.org Subject svn commit: r647921 - in
>> /harmony/enhanced/classlib/trunk/modules/beans/src:
>> main/java/java/beans/StandardBeanInfo.java
>> test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
>> Date Mon, 14 Apr 2008 18:00:13 GMT
>>
>> Author: ayza
>> Date: Mon Apr 14 11:00:08 2008
>> New Revision: 647921
>>
>> URL: http://svn.apache.org/viewvc?rev=647921&view=rev
>> Log:
>> Applying patches from HARMONY-5675 ([classlib][beans] Introspector unable to determine
set
>> method correctly)
>>
>> Modified:
>>     harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
>>     harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java?rev=647921&r1=647920&r2=647921&view=diff
>> ==============================================================================
>> --- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
>> (original)
>> +++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/StandardBeanInfo.java
>> Mon Apr 14 11:00:08 2008
>> @@ -47,6 +47,22 @@
>>
>>      private static final String SUFFIX_LISTEN = "Listener"; //$NON-NLS-1$
>>
>> +    private static final String STR_NORMAL = "normal"; //$NON-NLS-1$
>> +
>> +    private static final String STR_INDEXED = "indexed"; //$NON-NLS-1$
>> +
>> +    private static final String STR_VALID = "valid"; //$NON-NLS-1$
>> +
>> +    private static final String STR_INVALID = "invalid"; //$NON-NLS-1$
>> +
>> +    private static final String STR_PROPERTY_TYPE = "PropertyType"; //$NON-NLS-1$
>> +
>> +    private static final String STR_IS_CONSTRAINED = "isConstrained"; //$NON-NLS-1$
>> +
>> +    private static final String STR_SETTERS = "setters"; //$NON-NLS-1$
>> +
>> +    private static final String STR_GETTERS = "getters"; //$NON-NLS-1$
>> +
>>      private boolean explicitMethods = false;
>>
>>      private boolean explicitProperties = false;
>> @@ -276,7 +292,8 @@
>>                  // Sub is PropertyDescriptor
>>                  if (subIndexedType == null) {
>>                      // Same property type
>> -                    if (subType.getName().equals(superType.getName())) {
>> +                    if (subType != null &&
>> +                            subType.getName().equals(superType.getName())) {
>>                          if ((subGet == null) && (superGet != null)) {
>>                              subDesc.setReadMethod(superGet);
>>                          }
>> @@ -481,8 +498,6 @@
>>       * Introspects the supplied class and returns a list of the public methods
>>       * of the class
>>       *
>> -     * @param beanClass -
>> -     *            the class
>>       * @return An array of MethodDescriptors with the public methods. null if
>>       *         there are no public methods
>>       */
>> @@ -533,8 +548,8 @@
>>       * Introspects the supplied class and returns a list of the Properties of
>>       * the class
>>       *
>> -     * @param beanClass -
>> -     *            the Class
>> +     * @param stopClass -
>> +     *            the to introspecting at
>>       * @return The list of Properties as an array of PropertyDescriptors
>>       * @throws IntrospectionException
>>       */
>> @@ -557,6 +572,9 @@
>>              introspectSet(theMethods[i].getMethod(), propertyTable);
>>          }
>>
>> +        // fix possible getter & setter collisions
>> +        fixGetSet(propertyTable);
>> +
>>          // If there are listener methods, should be bound.
>>          MethodDescriptor[] allMethods = introspectMethods(true);
>>          if (stopClass != null) {
>> @@ -586,17 +604,17 @@
>>              if (table == null) {
>>                  continue;
>>              }
>> -            String normalTag = (String) table.get("normal"); //$NON-NLS-1$
>> -            String indexedTag = (String) table.get("indexed"); //$NON-NLS-1$
>> +            String normalTag = (String) table.get(STR_NORMAL);
>> +            String indexedTag = (String) table.get(STR_INDEXED);
>>
>>              if ((normalTag == null) && (indexedTag == null)) {
>>                  continue;
>>              }
>>
>> -            Method get = (Method) table.get("normalget"); //$NON-NLS-1$
>> -            Method set = (Method) table.get("normalset"); //$NON-NLS-1$
>> -            Method indexedGet = (Method) table.get("indexedget"); //$NON-NLS-1$
>> -            Method indexedSet = (Method) table.get("indexedset"); //$NON-NLS-1$
>> +            Method get = (Method) table.get(STR_NORMAL + PREFIX_GET);
>> +            Method set = (Method) table.get(STR_NORMAL + PREFIX_SET);
>> +            Method indexedGet = (Method) table.get(STR_INDEXED + PREFIX_GET);
>> +            Method indexedSet = (Method) table.get(STR_INDEXED + PREFIX_SET);
>>
>>              PropertyDescriptor propertyDesc = null;
>>              if (indexedTag == null) {
>> @@ -619,7 +637,7 @@
>>              } else {
>>                  propertyDesc.setBound(false);
>>              }
>> -            if (table.get("isConstrained") == Boolean.TRUE) { //$NON-NLS-1$
>> +            if (table.get(STR_IS_CONSTRAINED) == Boolean.TRUE) { //$NON-NLS-1$
>>                  propertyDesc.setConstrained(true);
>>              }
>>              propertyList.add(propertyDesc);
>> @@ -659,13 +677,20 @@
>>      @SuppressWarnings("unchecked")
>>      private static void introspectGet(Method theMethod,
>>  			HashMap<String, HashMap> propertyTable) {
>> -		String methodName = theMethod.getName();
>> -		if (methodName == null) {
>> +
>> +        String methodName = theMethod.getName();
>> +        int prefixLength = 0;
>> +        String propertyName;
>> +        Class propertyType;
>> +        Class[] paramTypes;
>> +        HashMap table;
>> +        ArrayList<Method> getters;
>> +
>> +        if (methodName == null) {
>>  			return;
>>  		}
>>
>> -		int prefixLength = 0;
>> -		if (methodName.startsWith(PREFIX_GET)) {
>> +        if (methodName.startsWith(PREFIX_GET)) {
>>  			prefixLength = PREFIX_GET.length();
>>  		}
>>
>> @@ -677,153 +702,325 @@
>>  			return;
>>  		}
>>
>> -		String propertyName = decapitalize(methodName.substring(prefixLength));
>> -		// validate property name
>> +		propertyName = decapitalize(methodName.substring(prefixLength));
>> +
>> +        // validate property name
>>  		if (!isValidProperty(propertyName)) {
>>  			return;
>>  		}
>>
>> -		Class propertyType = theMethod.getReturnType();
>> +        // validate return type
>> +        propertyType = theMethod.getReturnType();
>>
>> -		// check return type getMethod
>> -		if (propertyType.getName().equals(Void.TYPE.getName())) {
>> -			return;
>> -		}
>> +        if (propertyType == null || propertyType == void.class) {
>> +            return;
>> +        }
>>
>>  		// isXXX return boolean
>>  		if (prefixLength == 2) {
>> -			if (!propertyType.getName().equals(Boolean.TYPE.getName())) {
>> +			if (!(propertyType == boolean.class)) {
>>  				return;
>>  			}
>>  		}
>>
>> -		// indexed get method
>> -		Class[] paramTypes = theMethod.getParameterTypes();
>> -
>> -		if (paramTypes.length > 1) {
>> +        // validate parameter types
>> +        paramTypes = theMethod.getParameterTypes();
>> +		if (paramTypes.length > 1 ||
>> +                (paramTypes.length == 1 && paramTypes[0] != int.class))
{
>>  			return;
>>  		}
>>
>> -		String tag = "normal"; //$NON-NLS-1$
>> -
>> -		if (paramTypes.length == 1) {
>> -			if (paramTypes[0].getName().equals(Integer.TYPE.getName())) {
>> -				tag = "indexed"; //$NON-NLS-1$
>> -			} else {
>> -				return;
>> -			}
>> +        //
>>
>> -		}
>> -
>> -		HashMap table = propertyTable.get(propertyName);
>> +        table = propertyTable.get(propertyName);
>>  		if (table == null) {
>>  			table = new HashMap();
>>  			propertyTable.put(propertyName, table);
>>  		}
>>
>> -		// the "get" propertyType is conflict with "set" propertyType
>> -		Class oldPropertyType = (Class) table.get(tag + "PropertyType"); //$NON-NLS-1$
>> -		if ((oldPropertyType != null)
>> -				&& (!oldPropertyType.getName().equals(propertyType.getName()))) {
>> -			table.put(tag, "invalid"); //$NON-NLS-1$
>> -			table.remove(tag + "set"); //$NON-NLS-1$
>> -		} else {
>> -			table.put(tag, "valid"); //$NON-NLS-1$
>> -		}
>> -		
>> -		table.put(tag + "PropertyType", propertyType); //$NON-NLS-1$
>> +        getters = (ArrayList<Method>) table.get(STR_GETTERS);
>> +        if (getters == null) {
>> +            getters = new ArrayList<Method>();
>> +            table.put(STR_GETTERS, getters);
>> +        }
>>
>> -		// According to the spec "is" method should be used prior to "get"
>> -		if (prefixLength == 3) {
>> -			if (!table.containsKey(tag + "get")) { //$NON-NLS-1$
>> -				table.put(tag + "get", theMethod); //$NON-NLS-1$
>> -			}
>> -		} else {
>> -			table.put(tag + "get", theMethod); //$NON-NLS-1$
>> -		}
>> -	}
>> +        // add current method as a valid getter
>> +        getters.add(theMethod);
>> +    }
>>
>>      @SuppressWarnings("unchecked")
>>      private static void introspectSet(Method theMethod,
>>              HashMap<String, HashMap> propertyTable) {
>> -        String methodName = theMethod.getName();
>> -        if (methodName == null) {
>> -            return;
>> -        }
>>
>> -        int prefixLength = 0;
>> -        if (methodName.startsWith(PREFIX_SET)) {
>> -            prefixLength = PREFIX_GET.length();
>> -        }
>> +        String methodName = theMethod.getName();
>> +        String propertyName;
>> +        Class returnType;
>> +        Class[] paramTypes;
>>
>> -        if (prefixLength == 0) {
>> +        if (methodName == null || !methodName.startsWith(PREFIX_SET)) {
>>              return;
>>          }
>>
>> -        String propertyName = decapitalize(methodName.substring(prefixLength));
>> +        propertyName = decapitalize(methodName.substring(
>> +                PREFIX_SET.length()));
>>
>>          // validate property name
>>          if (!isValidProperty(propertyName)) {
>>              return;
>>          }
>>
>> -        Class returnType = theMethod.getReturnType();
>> +        // validate return type
>> +        returnType = theMethod.getReturnType();
>>
>> -        if (!returnType.getName().equals(Void.TYPE.getName())) {
>> +//        if (!returnType.getName().equals(Void.TYPE.getName())) {
>> +        if (!(returnType == void.class)) {
>>              return;
>>          }
>>
>> -        // indexed get method
>> -        Class[] paramTypes = theMethod.getParameterTypes();
>> +        // validate param types
>> +        paramTypes = theMethod.getParameterTypes();
>>
>> -        if ((paramTypes.length == 0) || (paramTypes.length > 2)) {
>> +        if (paramTypes.length == 0 || paramTypes.length > 2 ||
>> +                (paramTypes.length == 2 && paramTypes[0] != int.class))
{
>>              return;
>>          }
>>
>> -        String tag = "normal"; //$NON-NLS-1$
>> -
>> -        Class propertyType = paramTypes[0];
>> -
>> -        if (paramTypes.length == 2) {
>> -            if (paramTypes[0].getName().equals(Integer.TYPE.getName())) {
>> -                tag = "indexed"; //$NON-NLS-1$
>> -                propertyType = paramTypes[1];
>> -            } else {
>> -                return;
>> -            }
>> -        }
>> +        //
>>
>>          HashMap table = propertyTable.get(propertyName);
>>          if (table == null) {
>>              table = new HashMap();
>> +            propertyTable.put(propertyName, table);
>>          }
>>
>> -        Class oldPropertyType = (Class) table.get(tag + "PropertyType"); //$NON-NLS-1$
>> -        if ((oldPropertyType != null)
>> -                && (!oldPropertyType.getName().equals(propertyType.getName())))
{
>> -            table.put(tag, "invalid"); //$NON-NLS-1$
>> -            return;
>> +        ArrayList<Method> setters = (ArrayList<Method>) table.get(STR_SETTERS);
>> +        if (setters == null) {
>> +            setters = new ArrayList<Method>();
>> +            table.put(STR_SETTERS, setters);
>>          }
>>
>> -        table.put(tag, "valid"); //$NON-NLS-1$
>> -        table.put(tag + "set", theMethod); //$NON-NLS-1$
>> -        table.put(tag + "PropertyType", propertyType); //$NON-NLS-1$
>> -
>>          // handle constrained
>>          Class[] exceptions = theMethod.getExceptionTypes();
>>          for (Class e : exceptions) {
>>              if (e.equals(PropertyVetoException.class)) {
>> -                table.put("isConstrained", Boolean.TRUE); //$NON-NLS-1$
>> +                table.put(STR_IS_CONSTRAINED, Boolean.TRUE); //$NON-NLS-1$
>> +            }
>> +        }
>> +
>> +        // add new setter
>> +        setters.add(theMethod);
>> +    }
>> +
>> +    /**
>> +     * Checks and fixs all cases when several incompatible checkers /
>> +     * getters were specified for single property.
>> +     * @param propertyTable
>> +     * @throws IntrospectionException
>> +     */
>> +    private void fixGetSet(HashMap<String, HashMap> propertyTable)
>> +            throws IntrospectionException {
>> +
>> +        if (propertyTable == null) {
>> +            return;
>> +        }
>> +
>> +        for (String key : propertyTable.keySet()) {
>> +            HashMap<String, Object> table = propertyTable.get(key);
>> +            ArrayList<Method> getters = (ArrayList<Method>) table.get(STR_GETTERS);
>> +            ArrayList<Method> setters = (ArrayList<Method>) table.get(STR_SETTERS);
>> +
>> +            Method normalGetter = null;
>> +            Method indexedGetter = null;
>> +            Method normalSetter = null;
>> +            Method indexedSetter = null;
>> +
>> +            Class normalPropType = null;
>> +            Class indexedPropType = null;
>> +
>> +            if (getters == null) {
>> +                getters = new ArrayList<Method>();
>> +            }
>> +
>> +            if (setters == null) {
>> +                setters = new ArrayList<Method>();
>> +            }
>> +
>> +            // retrieve getters
>> +            for (Method getter: getters) {
>> +                // checks if it's a normal getter
>> +                if (getter.getParameterTypes() == null ||
>> +                        getter.getParameterTypes().length == 0) {
>> +                    // normal getter found
>> +                    if (normalGetter == null ||
>> +                            getter.getName().startsWith(PREFIX_IS)) {
>> +                        normalGetter = getter;
>> +                    }
>> +                }
>> +
>> +                // checks if it's an indexed getter
>> +                if (getter.getParameterTypes() != null &&
>> +                        getter.getParameterTypes().length == 1 &&
>> +                        getter.getParameterTypes()[0] == int.class) {
>> +                    // indexed getter found
>> +                    if (indexedGetter == null ||
>> +                            getter.getName().startsWith(PREFIX_IS)) {
>> +                        indexedGetter = getter;
>> +                    }
>> +                }
>> +            }
>> +
>> +            // retrieve normal setter
>> +            if (normalGetter != null) {
>> +                // Now we will try to look for normal setter of the same type.
>> +                Class propertyType = normalGetter.getReturnType();
>> +
>> +                for (Method setter: setters) {
>> +                    if (setter.getParameterTypes().length == 1 &&
>> +                            propertyType.equals(setter.getParameterTypes()[0]))
>> +                    {
>> +                        normalSetter = setter;
>> +                        break;
>> +                    }
>> +                }
>> +            } else {
>> +                // Normal getter wasn't defined. Let's look for the last
>> +                // defined setter
>> +
>> +                for (Method setter: setters) {
>> +                    if (setter.getParameterTypes().length == 1) {
>> +                        normalSetter = setter;
>> +                    }
>> +                }
>>              }
>> +
>> +            // retrieve indexed setter
>> +            if (indexedGetter != null) {
>> +                // Now we will try to look for indexed setter of the same type.
>> +                Class propertyType = indexedGetter.getReturnType();
>> +
>> +                for (Method setter: setters) {
>> +                    if (setter.getParameterTypes().length == 2 &&
>> +                            setter.getParameterTypes()[0] == int.class &&
>> +                            propertyType.equals(setter.getParameterTypes()[1]))
>> +                    {
>> +                        indexedSetter = setter;
>> +                        break;
>> +                    }
>> +                }
>> +            } else {
>> +                // Indexed getter wasn't defined. Let's look for the last
>> +                // defined indexed setter
>> +
>> +                for (Method setter: setters) {
>> +                    if (setter.getParameterTypes().length == 2 &&
>> +                            setter.getParameterTypes()[0] == int.class) {
>> +                        indexedSetter = setter;
>> +                    }
>> +                }
>> +            }
>> +
>> +            // determine property type
>> +            if (normalGetter != null) {
>> +                normalPropType = normalGetter.getReturnType();
>> +            } else if (normalSetter != null) {
>> +                normalPropType = normalSetter.getParameterTypes()[0];
>> +            }
>> +
>> +            // determine indexed getter/setter type
>> +            if (indexedGetter != null) {
>> +                indexedPropType = indexedGetter.getReturnType();
>> +            } else if (indexedSetter != null) {
>> +                indexedPropType = indexedSetter.getParameterTypes()[1];
>> +            }
>> +
>> +            // convert array-typed normal getters to indexed getters
>> +            if (normalGetter != null && normalGetter.getReturnType().isArray())
>> +            {
>> +
>> +            }
>> +
>> +            // RULES
>> +            // These rules were created after performing extensive black-box
>> +            // testing of RI
>> +
>> +            // RULE1
>> +            // Both normal getter and setter of the same type were defined;
>> +            // no indexed getter/setter *PAIR* of the other type defined
>> +            if (normalGetter != null && normalSetter != null &&
>> +                    (indexedGetter == null || indexedSetter == null) &&
>> +                    normalPropType != indexedPropType) {
>> +//                String tag = normalPropType.isArray() ?
>> +//                        STR_INDEXED : STR_NORMAL;
>> +                String tag = STR_NORMAL;
>> +
>> +                table.put(tag, STR_VALID);
>> +                table.put(tag + PREFIX_GET, normalGetter);
>> +                table.put(tag + PREFIX_SET, normalSetter);
>> +                table.put(tag + STR_PROPERTY_TYPE, normalPropType);
>> +                continue;
>> +            }
>> +
>> +            // RULE2
>> +            // normal getter and/or setter was defined; no indexed
>> +            // getters & setters defined
>> +            if ((normalGetter != null || normalSetter != null) &&
>> +                    indexedGetter == null && indexedSetter == null) {
>> +//                String tag = normalPropType.isArray() ?
>> +//                        STR_INDEXED : STR_NORMAL;
>> +                String tag = STR_NORMAL;
>> +
>> +                table.put(tag, STR_VALID);
>> +                table.put(tag + PREFIX_GET, normalGetter);
>> +                table.put(tag + PREFIX_SET, normalSetter);
>> +                table.put(tag + STR_PROPERTY_TYPE, normalPropType);
>> +                continue;
>> +            }
>> +
>> +            // RULE3
>> +            // mix of normal / indexed getters and setters are defined. Types
>> +            // are compatible
>> +            if ((normalGetter != null || normalSetter != null) &&
>> +                    (indexedGetter != null || indexedSetter != null) &&
>> +                    normalPropType.isArray() &&
>> +                    normalPropType.getComponentType() == indexedPropType) {
>> +                table.put(STR_NORMAL, STR_VALID);
>> +                table.put(STR_NORMAL + PREFIX_GET, normalGetter);
>> +                table.put(STR_NORMAL + PREFIX_SET, normalSetter);
>> +                table.put(STR_NORMAL + STR_PROPERTY_TYPE, normalPropType);
>> +
>> +                table.put(STR_INDEXED, STR_VALID);
>> +                table.put(STR_INDEXED + PREFIX_GET, indexedGetter);
>> +                table.put(STR_INDEXED + PREFIX_SET, indexedSetter);
>> +                table.put(STR_INDEXED + STR_PROPERTY_TYPE, indexedPropType);
>> +
>> +                continue;
>> +            }
>> +
>> +            // RULE4
>> +            // no normal normal getter / setter.
>> +            // Only indexed getter and/or setter is given
>> +            // no normal setters / getters defined
>> +            if (normalSetter == null && normalGetter == null &&
>> +                    (indexedGetter != null || indexedSetter != null)) {
>> +                table.put(STR_INDEXED, STR_VALID);
>> +                table.put(STR_INDEXED + PREFIX_GET, indexedGetter);
>> +                table.put(STR_INDEXED + PREFIX_SET, indexedSetter);
>> +                table.put(STR_INDEXED + STR_PROPERTY_TYPE,
>> +                        indexedPropType);
>> +                continue;
>> +            }
>> +
>> +            // default rule - invalid property
>> +            table.put(STR_NORMAL, STR_INVALID);
>> +            table.put(STR_INDEXED, STR_INVALID);
>>          }
>> -        propertyTable.put(propertyName, table);
>> +
>>      }
>>
>>      /**
>>       * Introspects the supplied Bean class and returns a list of the Events of
>>       * the class
>>       *
>> -     * @param beanClass
>>       * @return the events
>>       * @throws IntrospectionException
>>       */
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java?rev=647921&r1=647920&r2=647921&view=diff
>> ==============================================================================
>> --- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
>> (original)
>> +++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/IntrospectorTest.java
>> Mon Apr 14 11:00:08 2008
>> @@ -2331,4 +2331,254 @@
>>              assertFalse(pd.getName().equals("invisible"));
>>          }
>>      }
>> +
>> +    /**
>> +     * Tests tricky cases when several conflicting set/get methods are defined.
>> +     * All these tests pass on RI.
>> +     * This is a regression test for HARMONY-5675
>> +     * @throws IntrospectionException
>> +     */
>> +    public void test5675() throws IntrospectionException {
>> +        BeanInfo bInfo;
>> +
>> +        for (Class clz: new Class[] {TstBean5675.class, TstBean5675_2.class}) {
>> +
>> +            bInfo = Introspector.getBeanInfo(clz);
>> +
>> +            for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +                if (desc.getName().equals("prop1")) {
>> +                    assertNotNull("invalid get method", desc.getReadMethod());
>> +                    assertEquals("get method has invalid return type",
>> +                         Integer.class, desc.getReadMethod().getReturnType());
>> +                    assertNotNull("invalid set method", desc.getWriteMethod());
>> +                    assertEquals("invalid set method",
>> +                            "setProp1", desc.getWriteMethod().getName());
>> +                    assertNotNull("set method don't have any parameters",
>> +                            desc.getWriteMethod().getParameterTypes());
>> +                    assertEquals("set method has invalid parameters",
>> +                            Integer.class,
>> +                            desc.getWriteMethod().getParameterTypes()[0]);
>> +                }
>> +            }
>> +        }
>> +
>> +        for (Class clz : new Class[] {TstBean5675_3.class, TstBean5675_5.class,
>> +                TstBean5675_6.class}) {
>> +
>> +            bInfo = Introspector.getBeanInfo(clz);
>> +
>> +            for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +                if (desc.getName().equals("prop1")) {
>> +                    assertNull("Non-null get method", desc.getReadMethod());
>> +                    assertNull("Non-null set method", desc.getWriteMethod());
>> +                }
>> +            }
>> +        }
>> +
>> +        bInfo = Introspector.getBeanInfo(TstBean5675_4.class);
>> +        for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +            if (desc.getName().equals("prop1")) {
>> +                assertNotNull("invalid get method", desc.getReadMethod());
>> +                assertEquals("get method has invalid return type",
>> +                     Integer.class, desc.getReadMethod().getReturnType());
>> +                assertNull("Non-null set method", desc.getWriteMethod());
>> +            }
>> +        }
>> +
>> +        bInfo = Introspector.getBeanInfo(TstBean5675_7.class);
>> +        for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +            if (desc.getName().equals("prop1")) {
>> +                assertNull("Non-null get method", desc.getReadMethod());
>> +                assertEquals("invalid set method",
>> +                        "setProp1", desc.getWriteMethod().getName());
>> +                assertNotNull("set method don't have any parameters",
>> +                        desc.getWriteMethod().getParameterTypes());
>> +                assertEquals("set method has invalid parameters",
>> +                        Integer.class,
>> +                        desc.getWriteMethod().getParameterTypes()[0]);
>> +            }
>> +        }
>> +
>> +        bInfo = Introspector.getBeanInfo(TstBean5675_8.class);
>> +        for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +            if (desc.getName().equals("prop1")) {
>> +                assertNotNull("invalid get method", desc.getReadMethod());
>> +                assertEquals("get method has invalid return type",
>> +                     Integer[].class, desc.getReadMethod().getReturnType());
>> +                assertNull("Non-null set method", desc.getWriteMethod());
>> +            }
>> +        }
>> +
>> +        bInfo = Introspector.getBeanInfo(TstBean5675_9.class);
>> +        for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +            if (desc.getName().equals("prop1")) {
>> +                assertNull("Non-null get method", desc.getReadMethod());
>> +                assertNotNull("invalid set method", desc.getWriteMethod());
>> +                assertEquals("invalid set method",
>> +                        "setProp1", desc.getWriteMethod().getName());
>> +                assertNotNull("set method don't have any parameters",
>> +                        desc.getWriteMethod().getParameterTypes());
>> +                assertEquals("set method has invalid parameters",
>> +                        Integer[].class,
>> +                        desc.getWriteMethod().getParameterTypes()[0]);
>> +            }
>> +        }
>> +
>> +        bInfo = Introspector.getBeanInfo(TstBean5675_10.class);
>> +        for (PropertyDescriptor desc: bInfo.getPropertyDescriptors()) {
>> +
>> +            if (desc.getName().equals("prop1")) {
>> +                assertNotNull("invalid get method", desc.getReadMethod());
>> +                assertEquals("get method has invalid return type",
>> +                     Integer[].class, desc.getReadMethod().getReturnType());
>> +                assertNotNull("invalid set method", desc.getWriteMethod());
>> +                assertEquals("invalid set method",
>> +                        "setProp1", desc.getWriteMethod().getName());
>> +                assertNotNull("set method don't have any parameters",
>> +                        desc.getWriteMethod().getParameterTypes());
>> +                assertEquals("set method has invalid parameters",
>> +                        Integer[].class,
>> +                        desc.getWriteMethod().getParameterTypes()[0]);
>> +            }
>> +        }
>> +
>> +    }
>> +
>> +    class TstBean5675 {
>> +
>> +        public void setProp1(String uri) {}
>> +
>> +        public void setProp1(Integer i) {}
>> +
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +    }
>> +
>> +
>> +    class TstBean5675_2 {
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +        public String getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(Integer val) {}
>> +
>> +
>> +    }
>> +
>> +    class TstBean5675_3 {
>> +
>> +        public String getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(int n, String uri) {}
>> +
>> +        public void setProp1(Integer i) {}
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +    }
>> +
>> +    class TstBean5675_4 {
>> +
>> +        public void setProp1(String val) {}
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +    }
>> +
>> +    class TstBean5675_5 {
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +//        public void setProp1(Integer val) {}
>> +
>> +        public String getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(int n, String uri) {}
>> +
>> +
>> +    }
>> +
>> +    class TstBean5675_6 {
>> +
>> +        public Integer getProp1() {
>> +            return null;
>> +        }
>> +
>> +//        public void setProp1(Integer val) {}
>> +//
>> +//        public String getProp1(int n) {
>> +//            return null;
>> +//        }
>> +
>> +        public void setProp1(int n, String uri) {}
>> +
>> +
>> +    }
>> +
>> +    class TstBean5675_7 {
>> +        public void setProp1(String val) {}
>> +        public void setProp1(Integer val) {}
>> +    }
>> +
>> +    class TstBean5675_8 {
>> +        public Integer[] getProp1() {
>> +            return null;
>> +        }
>> +
>> +        //public void setProp1(Integer[] val) {}
>> +
>> +        public Integer getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(int n, Integer val) {}
>> +    }
>> +
>> +    class TstBean5675_9 {
>> +        public void setProp1(Integer[] val) {}
>> +
>> +        public Integer getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +    }
>> +
>> +    class TstBean5675_10 {
>> +        public Integer[] getProp1() {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(Integer[] val) {}
>> +
>> +        public Integer getProp1(int n) {
>> +            return null;
>> +        }
>> +
>> +        public void setProp1(int n, Integer val) {}
>> +    }
>> +
>>  }
>>
>>
>>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message