[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jakarta-commons-dev
Subject:    Re: [configuration] Accessing from EL script
From:       "Mark R. Diggory" <mdiggory () latte ! harvard ! edu>
Date:       2004-05-19 16:17:16
Message-ID: 40AB888C.4010206 () latte ! harvard ! edu
[Download RAW message or body]

Emmanuel Bourg wrote:

> Mark R. Diggory wrote:
>
>> For instance, storing :
>>
>> config.add("a.b", z);
>> config.add("a.b.c", y);
>> config.add("a.b.c.d.e", x);
>> config.add("a.b.c.d.e.f", w);
>>
>> ${sessionScope.configAttribute.a.b} --> z
>> ${sessionScope.configAttribute.a.b.c} --> y
>> ${sessionScope.configAttribute.a.b.c.d.e} --> x
>> ${sessionScope.configAttribute.a.b.c.d.e.f} --> w
>>
>> but
>>
>> ${sessionScope.configAttribute.a.b.c.d}
>>    --> Map containing {"e",x; Map [x[ { "f",w } }
>
>
> I'm not sure it works, if I understand well, the following EL:
>
> ${config.a.b.c}
>
> translates into (through reflexion):
>
> config.get("a").get("b").get("c");
>
> but what is supposed to return the get("b") part ? the value of "a.b" 
> that's "z" or the subset under "a.b" containing the "c", "c.d.e" and 
> "c.d.e.f" elements ?
>
> Emmanuel Bourg


Hmm, I get your point. That is a limiting factor, heres a possible solution:

In my example, we have the case that config.get("a") returns a nested 
structure of key --> Map pairs.
   
Map{
       "b",  Map {
                 "c", Map {
                             "d", Map {
                                        "e", Map {
                                                     "f", value
                                                       }
                                              }
                                  }
                         }
             }

so that you can do:

config.get("a").get("b").get("c");

however, how do we get the object value for the case of "a.b.c" as 
opposed to the collection of its children. I suspect the answer is 
similar to that of "DOM" where an Element node has both Attributes and 
Children. So, a Map in this case has both a coercable Default Value 
(toString()) and Children.

[..] conotates "default value"

Map a = config.get("a");

    Map {
       "b",  Map [z] {                                            -----> 
a.get("b").toString() = z
                 "c", Map [y] {                                   -----> 
a.get("b").get("c").toString() = y
                             "d", Map [NULL] {              -----> 
a.get("b").get("c").get("d").toString() = null
                                        "e", Map [x]{             -----> 
a.get("b").get("c").get("d").get("e").toString() = x
                                                     "f", w             
----> a.get("b").get("c").get("d").get("e").get("f").toString()  = w
                                                       }
                                              }
                                  }
                         }
             }

Unfortunately, JSTL's EL coercion isn't what I expected. I would expect 
Objects to be coerced to Strings using "toString()", then have the 
String coerced to Boolean, Number, char, etc... But Objects coerced to 
anything but string result in a coersion error. Which means that the 
results could never be used for EL arithmetic. That is something that 
could be taken up with the JSTL/EL folks though.

So for limited functionality, when a Map object is returned, it could be 
coerced to a String value using its "toString()" method at least for now.
 
So

${sessionScope.configAttribute.a.b} --> z
${sessionScope.configAttribute.a.b.c} --> y
${sessionScope.configAttribute.a.b.c.d.e} --> x
${sessionScope.configAttribute.a.b.c.d.e.f} --> w

but when ".b.c.d" is coerced

${sessionScope.configAttribute.a.b.c.d} --> null

as opposed to iterated over using JSTL which would be

${sessionScope.configAttribute.a.b.c.d}
   --> Map [NULL] {
            "e",x; Map [x] {
                          "f",w }
        }

-Mark




---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic