ParamsInterceptor doesn't populate request parameters on certain situations
---------------------------------------------------------------------------

                 Key: WW-3267
                 URL: https://issues.apache.org/struts/browse/WW-3267
             Project: Struts 2
          Issue Type: Bug
          Components: Core Interceptors
    Affects Versions: 2.1.6
         Environment: Tested on windows XP, java 1.5 and Tomcat 6
            Reporter: Ricardo Tercero Lozano


I've discovered a situation where ParamsInterceptor doesn't populate the action 
bean attributes.

This is the situation:

1) Webapp with struts2 deployed
2) Interceptor stack redefined to have an own interceptor before default stack 
(just before params interceptor indeed):

<interceptor-ref name="serverDate" />
<interceptor-ref name="defaultStack">
    <param name="validation.includeMethods">validar*</param>
    <param name="workflow.includeMethods">validar*</param>                      
                
</interceptor-ref>

Where serverDate is an interceptor that only puts an object into de ValueStack.

3) Test, for example, file upload interceptor. So put the 3 attributes onto a 
bean with setters/getters
        public File anexo;
        public String anexoContentType;
        public String anexoFileName;

4) Run it, and when execution control stops on action method, the attributes 
are not filled in.


After some debugging, I can add another restriction to this test case: the 
request params have to be direct action attributes (just 'address' instead of 
'form.address').

This is the execution sequence:

1.- First, control stops in 'doIntercept' method of ParamsInterceptor.
2.- on line 173, method retrieveParameters is called, returning the parameter 
list.
3.- on line 186, ac.getValueStack() is called. In debug mode, here the bad 
situation can be detected.
4.- on line 187, setParameters() method is called.
5.- on this method, on line 273 a newStack.setValue() is called.

So, attribute population is handled through setValue on the ValueStack.

In both, correct and error situation (no parameters inserted into ValueStack 
before paramsInterceptor) the call to setValue ends on method 'setProperty' of 
com.opensymphony.xwork.ognl.accessor.CompoundRootAccessor. This method iterates 
over the elements of the root property from OgnlStackValue, which is a 
CompoudRoot object. This CompoundRoot is, in fact, an array with StackValue 
root elements. CompoundRootAccessor.setProperty, sets a property on the first 
available element of the CompoundRoot with special programming for 2 object 
types:

1.- Objects with a set accessor available for the parameter to set.
2.- Maps to insert the parameter.

In the correct situation, the composition of the CompoundRoot is like this:

[0] ActionBean
[1] DefaultTextProvider

so the first available element of the CompoundRoot array with a setter for the 
property is the ActionBean resulting in a call to the bean setter property.

In the erro situation, with an interceptor inserting an object into the 
ValueStack previous to paramsInterceptor execution, the composition of the 
CompoundRoot is:

[0] HashMap<K,V>  (ValueStack root elements).
[1] ActionBean
[2] DefaultTextProvider

so the first available element of the CompoundRoot array with a setter is the 
HashMap resulting in the request parameters inserted into the root of the 
ValueStack, but not the ActionBean.

This is so, only for direct attributes of the action bean. If the named 
parameter has dots '.' for object navigation, the OgnlStackValue sets 
properties right.






-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to