Thanks Geoff, no can't see any major issues. Agree on the
initialization of roles in setupRender() since they really are used
for rendering only. Heavy use of lazy getter-based initialization has
gotten me into trouble before, but I may revisit my coding best
practice. And that's really the only thing I was after - to review my
understanding and practices against others'.

Kalle


On Wed, Sep 2, 2009 at 8:12 AM, Geoff
Callender<geoff.callender.jumpst...@gmail.com> wrote:
> To set the scene: in the EditUser example, the user is displayed in a form
> and the user roles are displayed below it in a grid with ActionLinks for
> View, Edit, and Delete on each row.
>
> The reason it is OK to get the user roles in setupRender() is because they
> are not editable - all we need is the id for the context of each ActionLink
> in the row. If you come back to this screen and hit a link then it will
> still work.
>
> Actually, if the user roles were editable you'd probably get them in
> onPrepare() rather than onActivate(), just as in the EditableLoop1 example.
> I can't recall why I preferred onPrepare() over onActivate() but I think it
> was because it's called exactly as often as it is needed whereas
> onActivate() is called often.
>
> If a ValueEncoder is used with the loop then it becomes OK to get the
> entities in setupRender() and encode them in onPrepare(). This is
> demonstrated in EditableLoopUsingEncoder1.
>
> Back in the user form, user.salutation is chosen from a Select list.  The
> list doesn't need to be built in onActivate() either.  It's done in
> getSalutations() and works just fine with the Back button.
>
> Can you see a hole in this that I've missed?
>
> Geoff
> http://jumpstart.doublenegative.com.au:8080/jumpstart/
>
> On 02/09/2009, at 11:56 PM, Kalle Korhonen wrote:
>
>> On Tue, Sep 1, 2009 at 11:30 PM, Geoff
>> Callender<geoff.callender.jumpst...@gmail.com> wrote:
>>>
>>> The key to it is this snippet: "if the stuff you are setting up is not
>>> needed for component event requests, consider putting it elsewhere". If I
>>> understand your example correctly, the object you are creating IS needed
>>> for
>>> a component event request so DO put it in onActivate(...).
>>
>> Yes, that's just the thing. Whether it's entities or translators or
>> anything, pretty much all of that "stuff" is needed for event
>> requests. Can you come up with a good example for initializing
>> something that is safe to do in setupRender()? Obviously if that
>> object is really needed just for rendering (as the operation name
>> suggests) then it's the right place for it, but those cases are few
>> and far between. Even in your example, the userRoles are most
>> certainly needed in event requests - obviously you can just return
>> error "user doesn't have the proper role for the operation" but it'd
>> be more usable to just do that in onActivate as well.
>>
>>> But with edit, if you want optimistic locking then you have to include
>>> the
>>> entity's version attribute in the form:
>>> in which case if you submit, press Back, then submit, you'll get an
>>> exception thrown by the persistence mechanism about optimistic locking -
>>> it
>>> tells us that the User has changed since the page was first displayed.
>>> It's
>>> correct, and all you do is hit refresh and try again. If you don't want
>>> optimistic locking then don't put the entity's version attribute in the
>>> form.
>>
>> Agree completely, that's a good pattern to follow.
>>
>> Kalle
>>
>>
>>> On 02/09/2009, at 4:03 PM, Kalle Korhonen wrote:
>>>
>>>> On Tue, Sep 1, 2009 at 9:50 PM, Geoff
>>>> Callender<geoff.callender.jumpst...@gmail.com> wrote:
>>>>>
>>>>> Good question. Yes, it does still seem to me to be best practice and
>>>>> no,
>>>>> I
>>>>> don't see it breaking the back button. Can you give an example?
>>>>
>>>> Assuming you use something else than session or client persistence and
>>>> you initialize (create) an object, set it as a value of some page
>>>> property in your setupRender(), then submit the form, press the back
>>>> button and re-submit the formit, the object will be null (because it
>>>> was initialized in setupRender() that was never invoked rather than
>>>> onActivate()).
>>>>
>>>> Kalle
>>>>
>>>>> On 01/09/2009, at 8:37 AM, Kalle Korhonen wrote:
>>>>>
>>>>>> Hey Geoff,
>>>>>>
>>>>>> I recall reading at some point that you had recommended not using
>>>>>> onActivate() for all initialization purposes, and sure enough, I dug
>>>>>> it up and at
>>>>>>
>>>>>>
>>>>>> http://jumpstart.doublenegative.com.au:8080/jumpstart/examples/navigation/onactivateandonpassivate/3
>>>>>> you say "It can be tempting to put lots of setup code into
>>>>>> onActivate(...). However, if the stuff you are setting up is not
>>>>>> needed for component event requests, consider putting it elsewhere,
>>>>>> such as setupRender() or getter methods."
>>>>>>
>>>>>> Does that still reflect your current understanding of the best
>>>>>> practices? The caveat with using setupRender() (or anything else
>>>>>> except for onActivate()) is that even for non-ajax applications, it
>>>>>> "breaks the back button", i.e. if a user goes back in history and say
>>>>>> re-submits a form (for one reason or another) the objects required by
>>>>>> the page/form are not initialized. Obviously it depends on the case
>>>>>> what the application should do, but you loose half the benefits of
>>>>>> redirect-after-post if your require a refresh before a page is usable
>>>>>> again. Do you simple prefer rendering an an error in the back
>>>>>> button/direct form submit case or do you generally do all
>>>>>> initialization in onActivate()?
>>>>>>
>>>>>> Kalle
>>>>>>
>>>>>>
>>>>>> On Tue, Aug 4, 2009 at 7:59 PM, Geoff
>>>>>> Callender<geoff.callender.jumpst...@gmail.com> wrote:
>>>>>>>
>>>>>>> Hi all,
>>>>>>>
>>>>>>> JumpStart 4.4 is now available.   It's a tidying up release: the
>>>>>>> structure's
>>>>>>> a bit neater and it uses the latest OpenEJB, ie. 3.1.1.
>>>>>>>
>>>>>>> Use it live:
>>>>>>>
>>>>>>>      http://jumpstart.doublenegative.com.au:8080/jumpstart/
>>>>>>>
>>>>>>> or download it:
>>>>>>>
>>>>>>>      http://jumpstart.doublenegative.com.au
>>>>>>>
>>>>>>> And if someone can figure how to get Jetty/OpenEJB in Eclipse to use
>>>>>>> the
>>>>>>> libs and classes in the WAR instead of having to be spoon-fed a
>>>>>>> classpath,
>>>>>>> then please let me know. I suspect it's a class-loading issue that
>>>>>>> might
>>>>>>> soon be solved by http://code.google.com/p/embed-openejb-in-eclipse/.
>>>>>>>
>>>>>>> Cheers,
>>>>>>>
>>>>>>> Geoff
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>>>
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>>
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to