Awesome!

Thanks Dick!

> -----Original Message-----
> From: Dick Zetterberg [mailto:[EMAIL PROTECTED]]
> Sent: Friday, January 24, 2003 4:10 PM
> To: [EMAIL PROTECTED]
> Subject: [OS-webwork] More tweaking of BeanUtil
> 
> 
> I have been doing some more tweaking of the BeanUtil class to 
> improve its performance.
> This time I tried to remove duplicated hash lookups and other 
> "costly" method calls like Method.getParameterTypes.
> I also made a change to the copy method as suggested by 
> Robert on the list.
> So the total improvements compared to 1.3RC2 are now:
> Setting of non-string property:  ~ 25% faster
> Setting of string property: ~ 10-15% faster
> Copy method: ~ 5-7% faster
> 
> Is it ok to commit these changes for the 1.3 version as well?
> 
> Cheers,
> 
> Dick
> ----------------------------
> 
> CVS diff follows:
> 
> Index: BeanUtil.java
> ===================================================================
> RCS file: 
> /cvsroot/opensymphony/webwork/src/main/webwork/util/BeanUtil.java,v
> retrieving revision 1.34
> diff -r1.34 BeanUtil.java
> 120c120,121
> <          PropertyDescriptor[] propertiesTo = 
> getPropertyDescriptors(to.getClass());
> 
> ---
> >          // Get the field map of the destination object once
> 
> >          Map fieldMap = getFieldMapForClass(to.getClass());
> 
> 124,127c125,131
> <             for (int j = 0; j < propertiesTo.length; j++)
> 
> <             {
> 
> <                PropertyDescriptor pdTo = propertiesTo[j];
> 
> <                if (pdFrom.getName().equals(pdTo.getName()))
> 
> ---
> >             // Look up the destination descriptor in the fieldMap
> 
> >             PropertyDescriptor pdTo = (PropertyDescriptor) 
> fieldMap.get(pdFrom.getName());
> 
> >             if (pdTo != null)
> 
> >             {
> 
> >                Method readMethod = pdFrom.getReadMethod();
> 
> >                Method writeMethod = pdTo.getWriteMethod();
> 
> >                if (writeMethod != null && readMethod != null)
> 
> 129,137c133,135
> <                   Method readMethod = pdFrom.getReadMethod();
> 
> <                   Method writeMethod = pdTo.getWriteMethod();
> 
> <                   if (writeMethod != null && readMethod != null)
> 
> <                   {
> 
> <                      writeParameters[0] = 
> pdFrom.getReadMethod().invoke(from, readParameters);
> 
> <                      if (!(!includeNull && 
> writeParameters[0] == null))
> 
> <                         pdTo.getWriteMethod().invoke(to, 
> writeParameters);
> 
> <                   }
> 
> <                   break;
> 
> ---
> >                   writeParameters[0] = 
> pdFrom.getReadMethod().invoke(from, readParameters);
> 
> >                   if (!(!includeNull && writeParameters[0] == null))
> 
> >                      pdTo.getWriteMethod().invoke(to, 
> writeParameters);
> 
> 165a164,167
> >          Map fieldMap = null;
> 
> >          // Get the fieldMap of the destination object once
> 
> >          if (keys.hasNext())
> 
> >             fieldMap = getFieldMapForClass(to.getClass());
> 
> 171c173
> <                setProperty(key, from.get(key), to);
> 
> ---
> >                setProperty(key, from.get(key), to, fieldMap);
> 
> 190a193
> > 
> 
> 203a207,228
> >       if (obj == null)
> 
> >       {
> 
> >          throw new IllegalArgumentException("The target 
> object for property '" + propertyName + "'. The target object 
> needs to be initialized to a non-null value in order to set 
> this property.");
> 
> >       }
> 
> >       Map fieldMap = getFieldMapForClass(obj.getClass());
> 
> >       setProperty(propertyName, val, obj, fieldMap);
> 
> >    }
> 
> > 
> 
> >    /**
> 
> >     * Set a single JavaBean property value on an object.
> 
> >     *
> 
> >     * If the values in the map are of type String or 
> String[] they may be converted
> 
> >     * to the actual property type by the use of property editors.
> 
> >     *
> 
> >     * @param   propertyName  String representing the 
> property or subproperty
> 
> >     * @param   val           the value to set
> 
> >     * @param   obj           the object to set the property on.
> 
> >     * @param   fieldMap      Map with the 
> PropertyDescriptors of the obj
> 
> >     * @exception   IllegalArgumentException
> 
> >     */
> 
> >    static protected void setProperty(String propertyName, 
> Object val, Object obj, Map fieldMap) throws IllegalArgumentException
> 
> >    {
> 
> 207a233
> >       Map curFieldMap;
> 
> 219,220c245,258
> <          PropertyDescriptor descriptor = 
> getPropertyDescriptor(curSegment.getId(), curObject);
> 
> < 
> 
> ---
> >          PropertyDescriptor descriptor;
> 
> >          // Is the current object the same as the original one?
> 
> >          // If not, get the field map for the new object
> 
> >          if (curObject != obj)
> 
> >          {
> 
> >             curFieldMap = getFieldMapForClass(curObject.getClass());
> 
> >          }
> 
> >          else
> 
> >          {
> 
> >             curFieldMap = fieldMap;
> 
> >          }
> 
> >          
> 
> >          // Lookup the descriptor in the curFieldMap
> 
> >          descriptor = (PropertyDescriptor) 
> curFieldMap.get(curSegment.getId());
> 
> 354,355c392,393
> <             propertyEditors = newEditorMap;
> 
> <       log.error("PropertyEditorManager.findEditor returned 
> null for class: " + clazz.getName());
> 
> ---
> >             propertyEditors = newEditorMap;
> 
> >             log.debug("PropertyEditorManager.findEditor 
> returned null for class: " + clazz.getName());
> 
> 498c536,538
> <       Class parameterClass = m.getParameterTypes()[0];
> 
> ---
> >       // The getParameterTypes method is inefficient so we 
> only call it once and save the result
> 
> >       Class[] parameterClasses = m.getParameterTypes();
> 
> >       Class parameterClass = parameterClasses[0];
> 
> 515c555,556
> <          setStringValueWithPropertyEditor(obj, descriptor, value);
> 
> ---
> >          // Set the value using a property editor. Pass in 
> the parameterClass
> 
> >          setStringValueWithPropertyEditor(obj, descriptor, 
> value, parameterClass);
> 
> 742a784
> >     * @param   paramClass      The parameter class used in 
> the write method. Passed in for efficiency.
> 
> 746c788
> <    static protected void 
> setStringValueWithPropertyEditor(Object obj, 
> PropertyDescriptor descriptor, String[] values) throws 
> IllegalArgumentException
> 
> ---
> >    static protected void 
> setStringValueWithPropertyEditor(Object obj, 
> PropertyDescriptor descriptor, String[] values, Class 
> paramClass) throws IllegalArgumentException
> 
> 760,761c802
> <                Class[] paramClasses = m.getParameterTypes();
> 
> <                Class paramClass = paramClasses[0];
> 
> ---
> >                // The paramClass was passed to this method, 
> now get the component type
> 
> 763c804
> <                if (paramClass.getComponentType() != null)
> 
> ---
> >                if (compType != null)
> 
> 765c806
> <                   Object a = 
> Array.newInstance(paramClass.getComponentType(), values.length);
> 
> 
> 
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.NET email is sponsored by:
> SourceForge Enterprise Edition + IBM + LinuxWorld =omething 2 See!
> http://www.vasoftware.com
> _______________________________________________
> Opensymphony-webwork mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
> 


-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
Opensymphony-webwork mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork

Reply via email to