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 09:03:41 GMT
Has successfully recreate this defect.
I think the null value of superType is the root cause for this defect.


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

> 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