What about using onconfigure to replace loadabledetachablemodel ? We
have had some trouble with loadabledetachablemodels when their state
is frozen before a dependent model has been initialized (for example)
and we need to call model.detach() from within our code, which seems
bit hacky.

Initializing also models at a specific known requestcycle moment might
be beneficial. Ofcourse it is not so straightforward as with
enable/visible state.

**
Martin

2010/12/1 Igor Vaynberg <igor.vaynb...@gmail.com>:
> i would be happy if that was good enough. in the past it hasnt been,
> thats why we have the current solution. maybe we can try it again in
> 1.5 and see what happens.
>
> -igor
>
> On Tue, Nov 30, 2010 at 11:44 AM, Pedro Santos <pedros...@gmail.com> wrote:
>> I have a different point of view, the HTTP imposes us some limitations, we
>> will hardly have an good synchronization between the component state on
>> browser and server using only HTTP conversation. So it is mandatory the
>> service layer to respect the described security restriction.
>>
>> On Tue, Nov 30, 2010 at 5:32 PM, Igor Vaynberg 
>> <igor.vaynb...@gmail.com>wrote:
>>
>>> an easy example is security.
>>>
>>> a user views a page that allows them to delete another user
>>> meanwhile their permissions are tweaked and they can no longer delete
>>> other users
>>> half an hour later the user clicks the delete button - this should
>>> fail, but wont if we are using last-rendered state.
>>>
>>> -igor
>>>
>>> On Tue, Nov 30, 2010 at 11:18 AM, Pedro Santos <pedros...@gmail.com>
>>> wrote:
>>> > I need to look better on which core components are relying on an updated
>>> > visibility/enabled state at the process event time, and why the last
>>> > rendered state wouldn't be enough to them to work nicely.
>>> >
>>> > On Tue, Nov 30, 2010 at 3:19 PM, Igor Vaynberg <igor.vaynb...@gmail.com
>>> >wrote:
>>> >
>>> >> currently we only invoke configure before the render. this would mean
>>> >> we would have to invoke it before processing a listener, clearing the
>>> >> cache, and then invoking it again before render. i wonder if that is
>>> >> enough places to invoke it....
>>> >>
>>> >> -igor
>>> >>
>>> >> On Tue, Nov 30, 2010 at 9:15 AM, Pedro Santos <pedros...@gmail.com>
>>> wrote:
>>> >> > If user click an link, it will change the value of some property at
>>> the
>>> >> > process_event request cycle step. Then the processor will go to the
>>> >> respond
>>> >> > step, will invoke every component before render method which will end
>>> up
>>> >> > invoking the Component#configure and updating the visibility/enabled
>>> >> state
>>> >> > (even if it changes, we are able to work with the updated state). So
>>> when
>>> >> > the this component has the opportunity to render it self, it will be
>>> >> aware
>>> >> > its update state.
>>> >> >
>>> >> > On Tue, Nov 30, 2010 at 2:39 PM, Igor Vaynberg <
>>> igor.vaynb...@gmail.com
>>> >> >wrote:
>>> >> >
>>> >> >> there are other places that should be checked though. for example
>>> >> >> before we invoke a listener on the component we should check again to
>>> >> >> make sure that visibility hasnt changed. eg if visibility depends on
>>> >> >> some property of the user clicking the link that changed between
>>> >> >> render and clicking the link.
>>> >> >>
>>> >> >> -igor
>>> >> >>
>>> >> >> On Tue, Nov 30, 2010 at 8:30 AM, Pedro Santos <pedros...@gmail.com>
>>> >> wrote:
>>> >> >> > An implementation idea:
>>> >> >> >
>>> >> >> > Component {
>>> >> >> >    public final void configure()
>>> >> >> >    {
>>> >> >> >        if (!getFlag(FLAG_CONFIGURED))
>>> >> >> >        {
>>> >> >> >            setVisible_NoClientCode(isVisible()); //we only check
>>> the
>>> >> user
>>> >> >> > isVisible in here
>>> >> >> >            onConfigure();
>>> >> >> >            setFlag(FLAG_CONFIGURED, true);
>>> >> >> >        }
>>> >> >> >    }
>>> >> >> > }
>>> >> >> >
>>> >> >> > On Tue, Nov 30, 2010 at 2:16 PM, Igor Vaynberg <
>>> >> igor.vaynb...@gmail.com
>>> >> >> >wrote:
>>> >> >> >
>>> >> >> >> so how is it different if they can still override something that
>>> >> needs
>>> >> >> >> to be checked all the time?
>>> >> >> >>
>>> >> >> >> -igor
>>> >> >> >>
>>> >> >> >> On Tue, Nov 30, 2010 at 8:02 AM, Pedro Santos <
>>> pedros...@gmail.com>
>>> >> >> wrote:
>>> >> >> >> > I understand the concern about possible isVisible
>>> implementations
>>> >> like
>>> >> >> >> >
>>> >> >> >> > isVisible(return currentlyTime < 10:00:00;) //imagine this
>>> >> component
>>> >> >> >> being
>>> >> >> >> > rendered at 09:59:59
>>> >> >> >> > isVisible(return dao.list().size() > 0);// performance issues
>>> >> >> >> >
>>> >> >> >> > But maybe we can have the best from both approaches. This is an
>>> >> >> >> copy/paste
>>> >> >> >> > from java.awt.Component:
>>> >> >> >> >
>>> >> >> >> >    public boolean isVisible() {
>>> >> >> >> >        return isVisible_NoClientCode();
>>> >> >> >> >    }
>>> >> >> >> >    final boolean isVisible_NoClientCode() {
>>> >> >> >> >        return visible;
>>> >> >> >> >    }
>>> >> >> >> >
>>> >> >> >> > There are some points in the awt framework were the isVisible
>>> >> method
>>> >> >> is
>>> >> >> >> not
>>> >> >> >> > used in benefit of isVisible_NoClientCode
>>> >> >> >> > I'm in favor of create an final isVisible/Enabled version and
>>> >> change
>>> >> >> the
>>> >> >> >> > Wicket core to use it. Also maintain the hotspot to users
>>> provide
>>> >> >> their
>>> >> >> >> > isVisible/Enable implementations that will serve to feed the
>>> core
>>> >> >> >> component
>>> >> >> >> > state.
>>> >> >> >> >
>>> >> >> >> > On Mon, Nov 29, 2010 at 4:56 PM, Igor Vaynberg <
>>> >> >> igor.vaynb...@gmail.com
>>> >> >> >> >wrote:
>>> >> >> >> >
>>> >> >> >> >> ive run into plenty of weird problems with overrides, but maybe
>>> >> >> >> >> because this was in a high concurrency app where data changed
>>> >> >> >> >> frequently. the problems arise from the fact that the value
>>> >> returned
>>> >> >> >> >> from isvisible() can change while we are doing traversals, etc.
>>> >> >> >> >>
>>> >> >> >> >> eg we run a traversal for all visible components and put them
>>> in a
>>> >> >> >> >> list. later we iterate over the list and try to render these
>>> >> >> >> >> components. the render function also checks their visibility
>>> and
>>> >> if
>>> >> >> >> >> they are no longer visible it throws an exception.
>>> >> >> >> >>
>>> >> >> >> >> if isvisible() override depends on some external factor like
>>> the
>>> >> >> >> >> database there is a small window where the value can change and
>>> >> now
>>> >> >> >> >> you can have a weird exception: such as "tried to invoke a
>>> >> listener
>>> >> >> on
>>> >> >> >> >> a component that is not visible or not enabled". these are very
>>> >> >> >> >> intermittent and damn near impossible to reproduce.
>>> >> >> >> >>
>>> >> >> >> >> another problem is performance. isvisible() is called multiple
>>> >> times
>>> >> >> >> >> during the request and if it depends on the database it can be
>>> a
>>> >> >> >> >> performance problem. in fact a couple of users have complained
>>> >> about
>>> >> >> >> >> this on the list in the past. at least now we have an easy
>>> >> solution
>>> >> >> >> >> for them - use onconfigure().
>>> >> >> >> >>
>>> >> >> >> >> so as of right now the developers have two choices: override
>>> >> >> >> >> isvisible() and potentially suffer the consequences. or,
>>> override
>>> >> >> >> >> onconfigure() and set visibility there in a more deterministic
>>> >> >> >> >> fashion.
>>> >> >> >> >>
>>> >> >> >> >> -igor
>>> >> >> >> >>
>>> >> >> >> >>
>>> >> >> >> >>
>>> >> >> >> >> On Mon, Nov 29, 2010 at 10:21 AM, Eelco Hillenius
>>> >> >> >> >> <eelco.hillen...@gmail.com> wrote:
>>> >> >> >> >> > To expand, unless I'm missing something (new?), things are
>>> >> really
>>> >> >> only
>>> >> >> >> >> > problematic when both the mutable value and the override are
>>> >> mixed.
>>> >> >> In
>>> >> >> >> >> > a way, I think that using the override is 'more pure', as
>>> it's a
>>> >> >> >> >> > simple function that is executed when needed, whereas mutable
>>> >> state
>>> >> >> >> >> > can be harder to deal with when trying to figure out how it
>>> got
>>> >> to
>>> >> >> be
>>> >> >> >> >> > in that state. So, sorry Igor, but we disagree on this one.
>>> >> >> >> >> >
>>> >> >> >> >> > Eelco
>>> >> >> >> >> >
>>> >> >> >> >> >
>>> >> >> >> >> > On Mon, Nov 29, 2010 at 10:13 AM, Eelco Hillenius
>>> >> >> >> >> > <eelco.hillen...@gmail.com> wrote:
>>> >> >> >> >> >> Niether is evil. It has potential pitfalls, which you should
>>> >> just
>>> >> >> be
>>> >> >> >> >> >> aware of. We use such overrides all over the place and never
>>> >> have
>>> >> >> >> >> >> problems with them either. :-) Avoiding it is safer, but
>>> also
>>> >> more
>>> >> >> >> >> >> verbose (in 1.3.x at least).
>>> >> >> >> >> >>
>>> >> >> >> >> >> Eelco
>>> >> >> >> >> >>
>>> >> >> >> >> >> On Mon, Nov 29, 2010 at 9:49 AM, Igor Vaynberg <
>>> >> >> >> igor.vaynb...@gmail.com>
>>> >> >> >> >> wrote:
>>> >> >> >> >> >>> On Mon, Nov 29, 2010 at 9:35 AM, Sven Meier <
>>> s...@meiers.net>
>>> >> >> >> wrote:
>>> >> >> >> >> >>>> Hi Douglas,
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>> WICKET-3171 describes a problematic case, where visibility
>>> of
>>> >> a
>>> >> >> >> >> >>>> component changes while its form is being processed.
>>> >> >> >> >> >>>> In our projects we're overriding isVisible() where
>>> >> appropriate
>>> >> >> and
>>> >> >> >> >> never
>>> >> >> >> >> >>>> encountered a similar problem.
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>> I'd say WICKET-3171 is the rare 5% usecase. What's next,
>>> is
>>> >> >> >> overriding
>>> >> >> >> >> >>>> isEnabled() going to be declared evil too? ;)
>>> >> >> >> >> >>>
>>> >> >> >> >> >>> yes
>>> >> >> >> >> >>>
>>> >> >> >> >> >>> -igor
>>> >> >> >> >> >>>
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>> Sven
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>> On Mon, 2010-11-29 at 11:22 -0600, Douglas Ferguson wrote:
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>>> Can you explain why? We have done this all over the
>>> place.
>>> >> >> >> >> >>>>>
>>> >> >> >> >> >>>>> D/
>>> >> >> >> >> >>>>>
>>> >> >> >> >> >>>>> On Nov 29, 2010, at 10:00 AM, Martin Grigorov wrote:
>>> >> >> >> >> >>>>>
>>> >> >> >> >> >>>>> > The recommended way since a few 1.4 releases is to
>>> >> override
>>> >> >> >> >> onConfigure()
>>> >> >> >> >> >>>>> > and call setVisible(true|false) depending on your
>>> >> conditions.
>>> >> >> >> >> >>>>> >
>>> >> >> >> >> >>>>> > On Mon, Nov 29, 2010 at 4:49 PM, Douglas Ferguson <
>>> >> >> >> >> >>>>> > doug...@douglasferguson.us> wrote:
>>> >> >> >> >> >>>>> >
>>> >> >> >> >> >>>>> >> Igor posted a comment to this bug saying that
>>> overriding
>>> >> >> >> >> isVisible() is
>>> >> >> >> >> >>>>> >> "evil"
>>> >> >> >> >> >>>>> >>
>>> >> >> >> >> >>>>> >>
>>> https://issues.apache.org/jira/browse/WICKET-3171
>>> >> >> >> >> >>>>> >>
>>> >> >> >> >> >>>>> >> I was surprised by this and am curious to hear more.
>>> >> >> >> >> >>>>> >>
>>> >> >> >> >> >>>>> >> D/
>>> >> >> >> >> >>>>>
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>>
>>> >> >> >> >> >>>
>>> >> >> >> >> >>
>>> >> >> >> >> >
>>> >> >> >> >>
>>> >> >> >> >
>>> >> >> >> >
>>> >> >> >> >
>>> >> >> >> > --
>>> >> >> >> > Pedro Henrique Oliveira dos Santos
>>> >> >> >> >
>>> >> >> >>
>>> >> >> >
>>> >> >> >
>>> >> >> >
>>> >> >> > --
>>> >> >> > Pedro Henrique Oliveira dos Santos
>>> >> >> >
>>> >> >>
>>> >> >
>>> >> >
>>> >> >
>>> >> > --
>>> >> > Pedro Henrique Oliveira dos Santos
>>> >> >
>>> >>
>>> >
>>> >
>>> >
>>> > --
>>> > Pedro Henrique Oliveira dos Santos
>>> >
>>>
>>
>>
>>
>> --
>> Pedro Henrique Oliveira dos Santos
>>
>

Reply via email to