Isn't someEntity.someId a String?

For example orderHeader.orderId in java would be:
String orderId = (String) orderHeader.get("orderId");

So my question is why does UEL evaluate orderId to an Integer when the actual type was a String? Or am I still missing something?

Regards
Scott

HotWax Media
http://www.hotwaxmedia.com

On 15/04/2009, at 1:01 PM, Adrian Crum wrote:


Scott,

You're missing something: The problem is with using integers as Map keys, not Map values.

-Adrian

--- On Tue, 4/14/09, Scott Gray <scott.g...@hotwaxmedia.com> wrote:

From: Scott Gray <scott.g...@hotwaxmedia.com>
Subject: Re: Discussion: UEL and backward incompatibility
To: dev@ofbiz.apache.org
Date: Tuesday, April 14, 2009, 5:22 PM
Sorry if I'm asking something obvious here and keep in
mind I haven't really followed the UEL introduction very
closely.

You say below that these numeric Ids are evaluated to
integers and my question is why exactly is that?  I'm
quite sure in 99% of cases the actual type of the map entry
value is a String which just happens to contain numbers.  So
in my mind whatever code is retrieving a map values using
dot syntax should preserve the type of the original value.
Maps in OFBiz almost never require (or want) automatic type
conversion of their values so is their any way to turn that
off?

Regards
Scott

HotWax Media
http://www.hotwaxmedia.com



On 15/04/2009, at 6:38 AM, Adrian Crum wrote:

As many of you know, the introduction of the Uniform
Expression Language into the framework caused some backward
compatibility problems - specifically with IDs being used as
Map keys. I tried to accommodate that with a couple of bits
of code, but there are still some issues.

There have been suggestions on the mailing list for
workarounds, but not all of them work, nor do they work all
the time. I don't want to hack up the UEL library
further, because its my viewpoint that OFBiz should conform
to existing standards, not twist existing standards to
conform to OFBiz.

The crux of the main problem is the implementation of
auto-vivify that I added to the UEL. Using the following
code as an example:

<set field="someVar[someEntity.someId]"
value="Hello World!"/>

If someVar was not previously defined, the auto-vivify
code tries to guess what data type someVar is supposed to
be. If someEntity.someId evaluates to an integer, the code
assumes it is an index and creates a List, otherwise it
creates a Map. This works fine in most cases.

The problem comes when someEntity.someId evaluates to
an integer (most IDs are integers) and the developer
intended someVar to be a Map, not a List. There needs to be
a way to create and empty Map in those cases.

I believe the best solution is to modify the
<set> element to allow the creation of an empty Map or
List. This will remove the ambiguity and solve the problem -
without further modifying UEL.

I modified my local copy to allow the creation of an
empty Map:

<set field="someVar"
type="NewMap"/>
<set field="someVar[someEntity.someId]"
value="Hello World!"/>

and it works great.

So, the bottom line is, I would like to add
"NewMap" and "NewList" to the
<set> element type attribute. What do you think?

-Adrian




Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to