I don't know how the proxy generation works, but in your getter method
you could return a wrapper to the proxy, which implements List, and
delegates to the proxy.

//a wrapper around a proxy sounds really wrong

musachy

On Mon, Feb 16, 2009 at 11:42 AM, Adam Hardy
<ahardy.str...@cyberspaceroad.com> wrote:
> More bad news to report.
>
> My fix for the XWorkCollectionPropertyAccessor allowed OGNL to handle the
> list as a collection. That was simple and good but short-sighted in
> hindsight.
>
> The property being set on the entity bean is a list with indexed access, and
> for that it needs the XWorkListPropertyAccessor. So OGNL immediately blew up
> again with a 'property not found' error because it was expecting a string,
> rejecting the integer index.
>
> Unfortunately OGNL is never going to invoke the List property accessor for
> the proxied list property at this point because /this OpenJPA proxy class
> only implements Collection/.
>
> I have still to ascertain how the OpenJPA proxying works. Obviously
> somewhere along the line in the normal state of play, the OpenJPA proxy can
> morph back into a List somehow.
>
> These OpenJPA proxies are created via Java 6 class redefinition. There are
> other ways of enhancing OpenJPA entities which I'll try if time allows.
>
>
>
>
>
> Musachy Barroso on 16/02/09 14:58, wrote:
>>
>> If you can create an xwork ticket and attach a patch it will be
>> appreciated :)
>>
>> musachy
>>
>> On Mon, Feb 16, 2009 at 5:52 AM, Adam Hardy
>> <ahardy.str...@cyberspaceroad.com> wrote:
>>>
>>> I figured out how to get my struts-default.xml to be loaded, in case you
>>> were going tell me how after I asked :O
>>>
>>> Consequently discovered that XWorkCollectionPropertyAccessor is actually
>>> compiled into Struts2 / XWork to allow work-arounds for OGNL, so it's not
>>> configurable.
>>>
>>> I'll build my own struts jar with modified source.
>>>
>>>
>>> Adam Hardy on 16/02/09 09:40, wrote:
>>>>
>>>> I use Sets too and they're not the problem here.
>>>>
>>>> The reason why this bug occurs is because the proxy that is returned by
>>>> my
>>>> entity bean is not recognised as an ArrayList by OGNL. Rather OGNL sees
>>>> it
>>>> as a Collection. I guess this is just a rare situation and a difficult
>>>> one
>>>> to follow. In this context on a stand-alone OGNL basis, it's not a
>>>> problem.
>>>>
>>>> The problem is that struts.xml in the struts jar configures ognl to use
>>>> XWorkCollectionPropertyAccessor for Collections and this class is badly
>>>> mis-named. It is unable to deal with Collections that are Lists, because
>>>> it
>>>> extends ognl.SetPropertyAccessor which casts the Collection to a Set,
>>>> causing a ClassCastException when acting on a List.
>>>>
>>>> In fact there is no ognl.CollectionPropertyAccessor so I created one and
>>>> for now I'm going to override struts-default.xml to set OGNL to use my
>>>> own
>>>> XWorkCollectionPropertyAccessor.
>>>>
>>>> I appreciate that this is an edge case, but if you look at
>>>> struts-default,
>>>> you'll see the bean for type ognl.PropertyAccessor
>>>> name=java.util.Collection
>>>> and name=java.util.Set are the same and you'll appreciate the problem
>>>> straight away  when you look at the base class ognl.SetPropertAccessor.
>>>>
>>>> I'd be happy to enter a Jira, but the question is where: OGNL, XWork or
>>>> Struts?
>>>>
>>>> Actually I'm having problems getting my version of struts-default.xml to
>>>> be read. I thought I had to reference the file in struts.properties and
>>>> have
>>>> both in my classpath:
>>>>
>>>> struts.configuration.files = atomic-struts-default.xml
>>>>
>>>> but that doesn't work.
>>>>
>>>>
>>>> Musachy Barroso on 16/02/09 00:24, wrote:
>>>>>
>>>>> It could be a bug, but I doubt it, I have used sets before and it
>>>>> works. Just as a test, try returning an empty HashSet from your
>>>>> method, instead of the proxy that it is returning now, and see if that
>>>>> works.
>>>>>
>>>>> musachy
>>>>>
>>>>> On Sun, Feb 15, 2009 at 7:14 PM, Adam Hardy
>>>>> <ahardy.str...@cyberspaceroad.com> wrote:
>>>>>>
>>>>>> Correct me if I'm wrong but this looks like a fundamental class
>>>>>> mismatch.
>>>>>>
>>>>>> I can see in struts-default.xml that both Sets and Collections are
>>>>>> configured to be accessed by the same PropertyAccessor.
>>>>>>
>>>>>> From debugging, I can see OGNL picks the PropertyAccessor for
>>>>>> Collections to
>>>>>> deal with my target property. Logical, since the ArrayList is an
>>>>>> implementation of Collection.
>>>>>>
>>>>>> The problem is that struts has registered
>>>>>> XWorkCollectionPropertyAccessor as
>>>>>> the PropertyAccessor for Collections, but this extends
>>>>>> ognl.SetPropertyAccessor which tries to cast the property to
>>>>>> java.util.Set
>>>>>> with the resulting ClassCastException.
>>>>>>
>>>>>> I noticed in an xwork jira that this seems to have happened before:
>>>>>>
>>>>>> http://jira.opensymphony.com/browse/XW-310
>>>>>>
>>>>>> but that's fixed - unfortunately not helping me though.
>>>>>>
>>>>>> I can work around this by copying XWorkCollectionPropertyAccessor and
>>>>>> writing a method to deal with Collections rather than Sets, but this
>>>>>> is
>>>>>> surely a bug. I'm just wondering why no-one else is suffering with it.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Adam Hardy on 14/02/09 13:35, wrote:
>>>>>>>
>>>>>>> Yes, it is a JPA entity bean proxied by OpenJPA.
>>>>>>>
>>>>>>> It has a list property - the bean is a parent in a parent-child
>>>>>>> relationship and this property is the list of children.
>>>>>>>
>>>>>>> This is the incoming HTTP parameter:
>>>>>>>
>>>>>>> portfolio.weightings[0]=123
>>>>>>>
>>>>>>> Despite debugging it I am still not sure what has happened but I do
>>>>>>> see
>>>>>>> that OgnlRuntime looks up the appropriate PropertyAccessor in a map,
>>>>>>> and
>>>>>>> gets the wrong one back (SetPropertyAccessor instead of
>>>>>>> ListPropertyAccessor).
>>>>>>>
>>>>>>> Is there anything I can do to influence that?
>>>>>>>
>>>>>>>
>>>>>>> Regards
>>>>>>> Adam
>>>>>>>
>>>>>>> Musachy Barroso on 13/02/09 17:10, wrote:
>>>>>>>>
>>>>>>>> It seems like it is not a list but a proxy to it
>>>>>>>> "org.apache.openjpa.util.java$util$ArrayList$proxy" which could be
>>>>>>>> the
>>>>>>>> root of the problem.
>>>>>>>>
>>>>>>>> musachy
>>>>>>>>
>>>>>>>> On Fri, Feb 13, 2009 at 12:00 PM, Adam Hardy
>>>>>>>> <ahardy.str...@cyberspaceroad.com> wrote:
>>>>>>>>>
>>>>>>>>> I have a situation where OGNL seems to be misinterpreting the class
>>>>>>>>> of
>>>>>>>>> the
>>>>>>>>> HTTP parameter property it is setting during the
>>>>>>>>> ParameterInterceptor
>>>>>>>>> call.
>>>>>>>>>
>>>>>>>>> As you can see from the exception message, the object is an
>>>>>>>>> ArrayList
>>>>>>>>> and
>>>>>>>>> certainly not a Set which OGNL thinks it is. I have double, triple
>>>>>>>>> and
>>>>>>>>> quadruple checked that I am not using a Set at this point.
>>>>>>>>>
>>>>>>>>> How and where is OGNL deciding that this is a Set? And can I
>>>>>>>>> configure
>>>>>>>>> it?
>>>>>>>>>
>>>>>>>>> The HTTP parameter is 'myParameter[0]' and the List is a generic,
>>>>>>>>> assuming
>>>>>>>>> that makes a difference.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> java.lang.ClassCastException:
>>>>>>>>> org.apache.openjpa.util.java$util$ArrayList$proxy cannot be cast to
>>>>>>>>> java.util.Set
>>>>>>>>>     at
>>>>>>>>> ognl.SetPropertyAccessor.getProperty(SetPropertyAccessor.java:46)
>>>>>>>>>     at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor.getProperty(XWorkCollectionPropertyAccessor.java:80)
>>>>>>>>>     at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1643)
>>>>>>>>>     at ognl.ASTProperty.getValueBody(ASTProperty.java:92)
>>>>>>>>>     at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)
>>>>>>>>>     at ognl.SimpleNode.getValue(SimpleNode.java:210)
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> For additional commands, e-mail: user-h...@struts.apache.org
>
>



-- 
"Hey you! Would you help me to carry the stone?" Pink Floyd

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to