[ http://issues.apache.org/jira/browse/BEANUTILS-259?page=all ]

Niall Pemberton updated BEANUTILS-259:
--------------------------------------

    Attachment: Resolver.java
                BasicResolver.java
                BasicResolverTestCase.java

I'm attaching an example implementation for review. Its not well tested and I 
haven't done the analysis to ensure that the implementation is backwardly 
compatible. However it demonstrates the main concept.

As an example, the PropertyUtilsBean's  getNestedPropertyMethod() would 
(hopefully) look something like the following:

    public Object getNestedProperty(Object bean, String name)
            throws IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {

        if (bean == null) {
            throw new IllegalArgumentException("No bean specified");
        }
        if (name == null) {
            throw new IllegalArgumentException("No name specified");
        }
        
        while (true) {
            String next = resolver.next(name);
            String propName = resolver.getName(next);
            String mapKey   = resolver.getMapKey(next);
            int index       = resolver.getIndex(next);
            if (bean instanceof Map) {
                bean = getPropertyOfMapBean((Map) bean, next);
            } else if (mapKey != null) {
                bean = getMappedProperty(bean, propName, mapKey);
            } else if (index >= 0) {
                bean = getIndexedProperty(bean, propName, index);
            } else {
                bean = getSimpleProperty(bean, propName);
            }
            if (bean == null) {
                throw new NestedNullException
                        ("Null property value for '" + next + "'");
            }
            name = resolver.remove(name);
            if (name == null) {
                return bean;
            }
        }
}

> Plugable Expression Resolver
> ----------------------------
>
>                 Key: BEANUTILS-259
>                 URL: http://issues.apache.org/jira/browse/BEANUTILS-259
>             Project: Commons BeanUtils
>          Issue Type: Improvement
>          Components: Bean / Property Utils
>    Affects Versions: 1.7.0
>            Reporter: Niall Pemberton
>         Assigned To: Niall Pemberton
>            Priority: Minor
>         Attachments: BasicResolver.java, BasicResolverTestCase.java, 
> Resolver.java
>
>
> There are a number of outstanding bugs against the BeanUtils expression 
> syntax with people wanting BeanUtils to support different variations. There 
> is also a duplication of the "expression evaluation" code in various methods 
> which can't be tested in isolation and is difficult to maintain as changes 
> have to be applied uniformly to various places.
> The main places where the code is duplicated:
>    PropertyUtilsBean
>               - getNestedProperty
>               - setNestedProperty
>               - getPropertyDescriptor
>    BeanUtilsBean
>               - copyProperty
>               - setProperty
> LocaleBeanUtils has also implemented an alternative mechanism - using a 
> Descriptor object to resolve references. BeanUtils and PropertyUtils also 
> work in slightly different ways. There are also other methods (e.g. 
> PropertyUtilsBean's getIndexedProperty() method) which also have related code.
> I propose to add a new "expression resolver" interface, which would be a 
> singleton and everywhere would delegate to to resolve property expressions. 
> This will allow easy testing as it can be tested in isolation and provide a 
> uniform mechanism accross BeanUtils. It will also allow alternative syntax to 
> be implemented if the resolver implementation can be configured.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to