The essence is that a

1) WOComponent is created for every occurrence within a specific page template 
for each session

2) stateless WOComponent is created once for any number of occurrences within 
any page template, additional instances are created if a stateless component is 
currently used by a thread and requested by another one

3) WODynamicElement is created for every occurrence within a specific page 
template


That means that if you have one page where the template uses your component / 
element three times and you are serving 5 users you end up with

1) 3 × 5 = 15

2) 1 ≤ n ≤ 5

3) 3

instances of your component / element. For 1) and 2) you can be sure that 
during a RR-phase you won’t share an instance with multiple threads (unless you 
do some weird things like passing a component instance into a background thread 
or stuff like that). However in case 3) those instances are shared with any 
thread that requests them which can happen at any time during the RR-loop where 
WO does not mind for initialization or cleanup of local values (that is one 
point in making those components fast).

jw


> Am 21.03.2017 um 23:18 schrieb Ricardo Parada <rpar...@mac.com>:
> 
> Was that in a session-less app instance perhaps? I have not tested that 
> scenario.
> 
> In my test I do not see dynamic elements being shared across sessions, so I'm 
> not seeing exactly how is it that concurrency plays a role in the session app 
> scenario where the dynamic elements are not shared with the ones from other 
> sessions processing a request at the same time.
> 
> But again, there may be something else, a property or something that affects 
> this sharing that I may be missing.
> 
> Anyways, the consensus is that it is a bad idea, so I'll follow advise and 
> implement it as a WOComponent subclass instead.
> 
> Thank you all.
> 
> On Mar 21, 2017, at 5:34 PM, Chuck Hill <ch...@gevityinc.com> wrote:
> 
>> I’ve run into code that did this in the past.  It is very, very much not fun 
>> to debug.  You could stash the values in a ThreadLocal or in the 
>> context.userInfo().  But don’t ever add state to a WODynamicElement subclass.
>> 
>> Chuck
>> 
>> From: <webobjects-dev-bounces+chill=gevityinc....@lists.apple.com> on behalf 
>> of Johann Werner <j...@oyosys.com>
>> Date: Tuesday, March 21, 2017 at 2:19 PM
>> To: Ricardo Parada <rpar...@mac.com>
>> Cc: WebObjectsDev <webobjects-dev@lists.apple.com>
>> Subject: Re: ERXWOConditional - where does it get installed?
>> 
>> Hi Ricardo,
>> 
>> you are ignoring one very important aspect of dynamic components: they must 
>> be thread-safe!
>> 
>> As soon as you are holding local values you will head to a serious mess. In 
>> your „manual“ tests of course you probably won’t ever encounter concurrency 
>> problems as long as you are not doing sort of automated parallel tests where 
>> multiple request are processed concurrently. Just think about why WO uses 
>> constructs like WOAssociations in dynamic components which introduce an 
>> additional layer of complexity to exchange / access request dependent 
>> values. Surely not for the fun of it ;-)
>> 
>> Of course concurrency problems only show up infrequently and are often not 
>> reproducible. So depending on the number and activity of your app users you 
>> could have been just luckily to not run into any problems or—most likely—did 
>> not notice when you actually hit one of those situations.
>> 
>> jw
>> 
>> 
>> PS: If you have access to the recordings of WOWODC 2012 there is actually a 
>> talk on dynamic elements.
>> 
>> 
>> Am 21.03.2017 um 21:11 schrieb Ricardo Parada <rpar...@mac.com>:
>> Hi all,
>> I’m just reporting back on my findings on whether saving state between 
>> appendToResponse and a subsequent takeValuesFromRequest in a dynamic 
>> component is bad or not.
>> I read Chuck’s Practical WebObjects, p. 193 where it talks about Dynamic 
>> Elements.  As he pointed out there, dynamic elements are shared among all 
>> instances of a WOComponent subclass.  My MPVWOConditional is implemented as 
>> a dynamic element because it extends ERXWOConditional which then extends 
>> WODynamicGroup which then extends WODynamicElement.
>> To test this I created a Hello app with a single page, Main.wo.  I have 
>> three MPVWOConditionals in there.  An instance is created for each 
>> occurrence of my MPVWOConditional in Main.  A total of three to be exact.
>> I then have a link on Main that calls an action returning a new instance of 
>> the page Main:
>> public WOActionResults newPage() {
>>      return pageWithName(Main.class);
>> }
>> Every time this newPage() action gets called I can confirm that the 
>> constructor in Main gets called, which indicates that a new page is being 
>> created every single time this action gets called.
>> However, the constructor of the MPVWOConditional is not getting called three 
>> times as when the first/second time the page was created.  On the other 
>> hand, the appendToResponse() of the MPVWOConditional keeps getting called 
>> three times, once for every instance of MPVWOConditional in Main.  The 
>> hashCode() of each of these three MPVWOConditional coincides with the ones 
>> that were previously created.
>> To summarize, when new instances of the page are created, the 
>> MPVWOConditionals are being reused on new instances of the page.
>> Fortunately, the dynamic components are not shared among page instances from 
>> different sessions.  Which makes sense.  The sharing only applies among 
>> instances within the same session.
>> I can see how some might object to storing this state in the dynamic 
>> component.  It has worked like this all this time.  It’s the way it works.
>> However, I think it is okay to save this piece of state between an 
>> appendToResponse and a subsequent takeValuesFromRequest because the 
>> takeValuesFromRequest is being done on the same page that generated the 
>> appendToResponse.
>> Furthermore, if a new page is created and the components are shared, their 
>> appendToResponse will get called and this piece of state will be re-computed 
>> and saved awaiting a subsequent takeValuesFromRequest.
>> Now, let’s assume that instead of submitting a form, a regular action is 
>> called on the page.  Let’s suppose this action retrieves the previous page 
>> from some sort of cache and returns that page.  Then that page’s 
>> appendToResponse will get called and so will the appendToResponse of the  
>> dynamic components being shared, which would recompute the condition and 
>> save it awaiting a possible subsequent takeValuesFromRequest or 
>> invokeAction.  Again, this behavior just makes the appendToResponse 
>> consistent with the invokeAction/takeValuesFromRequest phases.
>> Having this behavior has corrected problems for me.  It is yet to be 
>> determined whether this will create a problem.  If I find out later that 
>> this creates a problem I’ll be happy to report back to the group.
>> But so far, on my tests, it looks like it is okay.
>> Thanks for all the comments and feedback.
>> Ricardo
>> On Mar 14, 2017, at 10:46 AM, Samuel Pelletier <sam...@samkar.com> wrote:
>> Ricardo,
>> This patch seem dangerous to first. I do not thing it is safe to have state 
>> in WODynamicElement. I think they can be reused by the framework.
>> The correct way is to make sure the condition does not change during RR loop 
>> cycle, same apply to WORepetition list for example.
>> Regards,
>> Samuel
>> Le 14 mars 2017 à 09:53, Ricardo Parada <rpar...@mac.com> a écrit :
>> Thanks Samuel.  I see that now.
>> Have others experienced a problem where a form is submitted and then during 
>> takeValuesFtomTequest a condition that was false when the page was rendered 
>> becomes true all of a sudden causing some input elements (textfields, pop-up 
>> list, etc.) to participate in takeValuesFromRequest even though those 
>> elements were not on the page when the form was submitted? This causes those 
>> elements to be set to null.   I've ran into such bugs in the past many times.
>> I have been able to prevent that from happening by using the following code:
>> public class MPVWOConditional extends ERXWOConditional {
>>     protected boolean conditionValue = false;
>>     public MPVWOConditional(String name, NSDictionary dict, WOElement 
>> element) {
>>        super(name, dict, element);
>>     }
>>     @Override
>>     public void appendToResponse(WOResponse woresponse, WOContext wocontext) 
>> {
>>        // Cache the condition every time the page is being rendered
>>        conditionValue = 
>> _condition.booleanValueInComponent(wocontext.component());
>>        super.appendToResponse(woresponse, wocontext);
>>     }
>>     /**
>>      * Returns the value for the condition binding cached during 
>> appendToResponse.
>>      * This makes the takeValuesFromRequest consistent with the 
>> appendToResponse
>>      * preceding it by making sure that input elements that were not present 
>> on
>>      * the page at the time the form was submitted do not participate in
>>      * takeValuesFromRequest inadvertently.
>>      */
>>      @Override
>>      protected boolean conditionInComponent(WOComponent wocomponent) {
>>         return conditionValue;
>>      }
>> }
>> On Mar 14, 2017, at 9:39 AM, Samuel Pelletier <sam...@samkar.com> wrote:
>> Hi,
>> If you use inline bindings with ONGL, the class WOHelperFunctionTagRegistry 
>> registers classes mapped to tag
>>                     
>> WOHelperFunctionTagRegistry.registerTagShortcut("ERXElse", "else");
>>                     
>> WOHelperFunctionTagRegistry.registerTagShortcut("ERXWOConditional", "if");
>>                     
>> WOHelperFunctionTagRegistry.registerTagShortcut("ERXWOConditional", 
>> "conditional");
>> Samuel
>> Le 13 mars 2017 à 19:46, Ricardo Parada <rpar...@mac.com> a écrit :
>> Hi all,
>> Does anybody know where does ERXWOConditional install to replace 
>> WOConditional?
>> I created an MPVWOConditional which extends ERXWOConditional and fixes a bug 
>> and want to install it as the one to use for WOConditional.
>> I checked in ERXPatches but it does not seem to be getting installed there.  
>> Does anybody know?
>> Thanks
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/webobjects-dev/samuel%40samkar.com
>> This email sent to sam...@samkar.com
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/webobjects-dev/jw%40oyosys.com
>> This email sent to j...@oyosys.com

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to