Adrian Crum wrote:
> Adam Heath wrote:
>> Adrian Crum wrote:
>>> David,
>>>
>>> Thank you for the detailed description of the problem - that made it
>>> much easier to track down.
>>>
>>> Yes it is UEL related, and also related to weak Java code in
>>> mini-language.
>>>
>>> The mini-lang code causing the exception is:
>>>
>>> <field-to-list field-name="orderItemShipGrpInvResAndItemLocation"
>>> list-name="oiirailByProdMap.${orderItemShipGrpInvResAndItemLocation.productId}"/>
>>>
>>>
>>>
>>> The ${orderItemShipGrpInvResAndItemLocation.productId} expression is
>>> evaluated and returns a String - "GZ-2644". The String is appended to
>>> orderItemShipGrpInvResAndItemLocation and the result is
>>>
>>> "orderItemShipGrpInvResAndItemLocation.GZ-2644"
>>>
>>> That String is handed off to the JUEL library for evaluation. I haven't
>>> looked into the JUEL code to be sure, but I can assume JUEL thinks that
>>> expression means "Take the orderItemShipGrpInvResAndItemLocation.GZ
>>> variable and subtract 2644 from it." So, JUEL returns -2644.
>>>
>>> The exception is thrown in FieldToList.java:
>>>
>>> List<Object> toList = listAcsr.get(methodContext);
>>> if (toList == null) {
>>>     if (Debug.verboseOn()) Debug.logVerbose("List not found with name "
>>> + listAcsr + ", creating new list", module);
>>>     toList = FastList.newInstance();
>>>     listAcsr.put(methodContext, toList);
>>> }
>>>
>>> Changing that to:
>>>
>>>
>>> List<Object> toList = null;
>>> try {
>>>     toList = listAcsr.get(methodContext);
>>> } catch (Exception e) {}
>>> if (toList == null) {
>>>     if (Debug.verboseOn()) Debug.logVerbose("List not found with name "
>>> + listAcsr + ", creating new list", module);
>>>     toList = FastList.newInstance();
>>>     listAcsr.put(methodContext, toList);
>>> }
>>>
>>> fixes the problem. It also makes more sense - because you can't assume
>>> the object returned will always be a List (even without UEL).
>>>
>>> Looking through the mini-language Java code, I see that assumption is
>>> made a lot. I'm not sure where to go from here. Surrounding all of the
>>> type casts with try-catch blocks would be a worthwhile endeavor, but it
>>> is also a lot of work.
>>>
>>> Anyways, I've made the change to most of the classes and can commit
>>> them, but there are chances this exception might pop up elsewhere.
>>>
>>> What do you think?
>>
>> No, not correct.
>>
>> If you have to change all the methods, then you are fixing the wrong
>> problem.  The generics keep this problem from occuring.  The problem
>> lies elsewhere, where-ever the listAcsr stuff is instantiated.
> 
> That uses the UtilGenerics.cast() method - because the Map of context
> variables doesn't contain a single Object type - they could be anything.

It's called listAcsr, because the users of it require a list to be in
the map.  If someone doesn't put a list into the map, then it's that
someone else that is the problem.  Fix the correct problem, whatever put
the wrong type of object into the map.

Reply via email to