[ http://issues.apache.org/jira/browse/TAPESTRY-766?page=all ]

Patrick Casey updated TAPESTRY-766:
-----------------------------------

    Attachment: Case.jwc

> Switch/Case (pseudo) component pair
> -----------------------------------
>
>          Key: TAPESTRY-766
>          URL: http://issues.apache.org/jira/browse/TAPESTRY-766
>      Project: Tapestry
>         Type: New Feature
>   Components: Framework
>     Versions: 3.0.3
>     Reporter: Patrick Casey
>  Attachments: Case.java, Case.jwc, Switch.java, Switch.jwc
>
> The Problem:
>  
> Rendering a page with a large number of conditionally displayed sub-sections 
> inside of tapestry produces some remarkable ugly looking code; more to the 
> point it tends to gun up your performance because the system is evaluating 
> each and every one of your conditions, even if you, as is quite common, want 
> one and only one section to render.
>  
> e.g.
>  
> <span jwcid="@Conditional" condition="ognl:today == [EMAIL PROTECTED] >
>    Welcome to work. Hope your weekend was good.
> </span>
> <span jwcid="@Conditional" condition="ognl:today == [EMAIL PROTECTED] >
>    Welcome back.
> </span>
> <span jwcid="@Conditional" condition="ognl:today == [EMAIL PROTECTED] >
>    Only three more days to go!
> </span>
> ...
>  
> My recent dive into the bowels of ognl with a profiler (see my previous post 
> on the subject) actually inspired me to set about minimizing the number of 
> ognl calls my applications have to make. So, this was my attempt to 
> dramatically trim down the number of @Conditionals I have to use.
>  
> The Solution:
>  
> I've implemented (and attached) a Tapestry pseudo switch ... case component 
> pair. To use it, set up an outer switch component, and nest as many case 
> components within it as you want e.g.
>  
> <span jwcid="@Switch" switchOn="ognl:today">       
>     <span jwcid="@Case" token="ognl:@[EMAIL PROTECTED]"> 
> Welcome to work. Hope your weekend was good.
>     </span>
>     <span jwcid="@Case" token="ognl:@[EMAIL PROTECTED]"> 
>    Welcome back.
>     </span>
>     <span jwcid="@Case" token="ognl:@[EMAIL PROTECTED]"> 
>    Only three more days to go!
>     </span>
> </span>
>  
> Limitations:
>  
> 1)       You can't put anything inside the switch statement *except* case 
> statement. Anything between the start of the @Switch span and the end of the 
> @Switch span which isn't an @Case, gets ignored completely.
> 2)       The switch statement switches on a string (internally it's just a 
> hashmap). So if you want to switch on something else, convert it to a string 
> before you pass it in.
> 3)       I haven't (yet at least) figured out how to support multiple cases 
> resolving into the same execution block. So if you want Tuesday, Wednesday, 
> and Thursday all to say "The middle of the week sucks", you'll need to have 
> three case blocks, one for each day L. Maybe somebody smarter than I can sort 
> out how to stack them.
>  
> Performance Notes:
>  
> 1)                   Yes, it is faster than either @Conditionals or 
> @contrib:Choose. Profiled render time for 5 renders of one of my more complex 
> forms was 3.520 seconds for @Choose, 3.323 seconds for @Conditional and 2.523 
> seconds for @Switch. The speed comes from reducing the number of (hugely) 
> expensive ognl calls it has to make, largely by reducing the size of the 
> expressions e.g. "ognl:today == [EMAIL PROTECTED]" becomes "ognl: @[EMAIL 
> PROTECTED]", halving the number of evaluation cycles. Curiously, 
> contrib:Choose is actually marginally slower according to my profiling than 
> just brute force @Conditionals. I've chalked it up as random variance in my 
> profiling for the moment, but its still a head scratcher.
> 2)                   I have to evaluate each @Case token to determine if it's 
> a match for the switch, so if you can use a *static* @Case statement, you'll, 
> again, save yourself an ognl call thus token="4" is dramatically faster than 
> token="ognl:getFour()". Sometimes that's not possible, of course, so I still 
> support the ognl. 
>  
> General Case Caveot:
>  
> As usual, whenever I'm mucking around in the bowels of Tapestry, I'm 
> reminding that I don't think the same way Howard does; so there's a small but 
> very real chance that I built this whole component based on some deeply 
> flawed and fundamentally dangerous assumptions about the framework. With that 
> said though, it *does* work for me, and I'm planning on rolling it out as 
> part of the current project I'm working on.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to