Reading the archives for Igor's work on "component queueing" I see

Igor 
Vaynberg<https://issues.apache.org/jira/secure/ViewProfile.jspa?name=ivaynberg>
added
a comment - 09/Jul/11 23:39

@Juergen, right now your tests only test for rendering, but they should
also test that before queued component's oninitialize is called the
component is already a child of the correct parent.

https://issues.apache.org/jira/browse/WICKET-3335


This means that
org.apache.wicket.application.IComponentInitializationListener cannot be
used. The tree (re)building should happen *before *components'
#onInitialize() and .IComponentInitializationListener#onInitialize() is
called *after*.

Martin Grigorov
Wicket Training and Consulting


On Fri, Jan 24, 2014 at 2:22 PM, Martin Grigorov <mgrigo...@apache.org>wrote:

> I've added alternative ways to use MarkupDrivenComponentTreeBuilder:
> - with org.apache.wicket.MarkupDrivenTreeInitializionListener
> - with org.apache.wicket.MarkupDrivenComponentTreeBehavior#onConfigure
>
> Both of them do not check the configuration setting whether markup driven
> tree construction is enabled for now.
>
> The approach with MarkupDrivenTreeInitializionListener works the same way
> as the "inlined" version. The component tree rebuild is activated *after*
> all Component#onInitialize().
>
> The approach with MarkupDrivenComponentTreeBehavior uses #onConfigure().
> Here I had to change Enclosure class - the child component resolving should
> be done as late as possible just before the rendering phase starts.
>
> Martin Grigorov
> Wicket Training and Consulting
>
>
> On Fri, Jan 24, 2014 at 11:47 AM, Martin Grigorov <mgrigo...@apache.org>wrote:
>
>> OK, the new impl is committed.
>> Now MarkupContainer has #enqueue(Component...) method that adds
>> components into a list.
>> Later org.apache.wicket.ComponentTreeBuilder#rebuild() uses the list, and
>> finally the list is null-yfied in #onDetach() so it is not serialized and
>> not available for the next requests. I guess the null-yfing can be done
>> earlier so even the first request have the extra bytes after the rebuild of
>> the tree.
>>
>> No need of @Auto anymore.
>>
>> Martin Grigorov
>> Wicket Training and Consulting
>>
>>
>> On Fri, Jan 24, 2014 at 10:39 AM, Martin Grigorov 
>> <mgrigo...@apache.org>wrote:
>>
>>>
>>>
>>> On Fri, Jan 24, 2014 at 9:48 AM, Sven Meier <s...@meiers.net> wrote:
>>>
>>>> > per-component basis - yes, as I explained earlier this is possible
>>>> with the current impl
>>>>
>>>> I must have missed that. Is there an example in the branch?
>>>>
>>>
>>> See
>>> https://github.com/apache/wicket/blob/markup-driven-component-tree/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java?source=c#L1886
>>> There is no test yet.
>>>
>>>
>>>>
>>>> I don't understand why there's need for an @Auto annotation. Why would
>>>> some components be annotated and some not?
>>>
>>>
>>> The annotation was needed to be able to find the component faster.
>>> I.e. check only annotated fields. If @Auto(id=...) then use the id to
>>> match against the component tag id.
>>>
>>> But with my new idea, the one that will solve the issue with the extra
>>> bytes, this won't be needed anymore.
>>> Stay tuned.
>>>
>>>
>>>>
>>>>
>>>>  behaviors don't have hooks for onInitialize()
>>>>>
>>>>
>>>> It could be done in #onConfigue(), that's early enough.
>>>
>>>
>>> The problem is that it is called for each request.
>>> For now I think there is no need to rebuild the component tree for each
>>> request, so we will have to use a guard (e.g. boolean field in the
>>> component).
>>> I will consider it.
>>>
>>>
>>>>
>>>>
>>>>  Additionally I think using Behavior will add a bit more bytes to each
>>>>> component than the current solution
>>>>>
>>>>
>>>> I don't think that is a problem: IMHO it's important to make this
>>>> feature optional, so when users don't use it then they do not pay a price.
>>>>
>>>> Regards
>>>> Sven
>>>>
>>>>
>>>>
>>>>
>>>> On 01/24/2014 06:35 AM, Martin Grigorov wrote:
>>>>
>>>>> On Fri, Jan 24, 2014 at 12:04 AM, Sven Meier <s...@meiers.net> wrote:
>>>>>
>>>>>  Hi,
>>>>>>
>>>>>> I don't think we're heading the right direction with this and I
>>>>>> wouldn't
>>>>>> advertise it as anything yet.
>>>>>>
>>>>>>  I'd like to advertise it anyhow now just to have more people feeding
>>>>> me
>>>>> with stoppers, as you and Igor do. Thanks! :-)
>>>>>
>>>>>
>>>>>  There are more questions to come but here is one upfront:
>>>>>>
>>>>>>
>>>>>>  And it is configurable, by default disabled.
>>>>>>>
>>>>>> As Igor has written, this does not work with component libraries which
>>>>>> depend on the new feature.
>>>>>> Couldn't this feature be enabled/disabled on a per-component basis?
>>>>>> Why
>>>>>> not make it a behavior that you can attach to components if you want
>>>>>> to use
>>>>>> automatic resolving/rearranging of its children?
>>>>>>
>>>>>>  - per-component basis - yes, as I explained earlier this is possible
>>>>> with
>>>>> the current impl
>>>>> - behaviors don't have hooks for onInitialize()
>>>>> After Igor's feedback I think onAfterInitialize() is what is needed, so
>>>>> apps can use onInitialize() as a complement to the constructor
>>>>> Additionally I think using Behavior will add a bit more bytes to each
>>>>> component than the current solution
>>>>>
>>>>>
>>>>>  Regards
>>>>>> Sven
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 01/23/2014 05:20 PM, Martin Grigorov wrote:
>>>>>>
>>>>>>  Once the markup driven construction is done (just before
>>>>>>> onInitialize())
>>>>>>> the application will have to use the old good add()/addOrReplace().
>>>>>>>
>>>>>>> The components are already in the MarkupContainer#children data
>>>>>>> structure.
>>>>>>> So each field will add extra 8 bytes on 64bit machine (or 4 bytes
>>>>>>> with
>>>>>>> CompressedOops enabled).
>>>>>>> Serialization is the same - the object is written once, with several
>>>>>>> pointers.
>>>>>>>
>>>>>>> I am also not fully sure in the approach but I am experimenting and
>>>>>>> so far
>>>>>>> it works well.
>>>>>>> And it is configurable, by default disabled.
>>>>>>> We can advertise it as experimental ?!
>>>>>>>
>>>>>>> I will add more use cases/tests soon.
>>>>>>> And caching for the reflection stuff.
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Jan 23, 2014 at 6:09 PM, Igor Vaynberg <
>>>>>>> igor.vaynb...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>   what about components added in onInitialize() or on onConfigure()?
>>>>>>>
>>>>>>>> this will also lead to a higher memory/serialization space usage
>>>>>>>> since
>>>>>>>> by default you need a field to store the component ref.
>>>>>>>>
>>>>>>>> not sure its worth doing it this way...
>>>>>>>>
>>>>>>>> -igor
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wed, Jan 22, 2014 at 12:12 PM, Martin Grigorov <
>>>>>>>> mgrigo...@apache.org>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>  Hi,
>>>>>>>>>
>>>>>>>>> Recently Fridolin Jackstadt shared his approach to "autowire"
>>>>>>>>> components
>>>>>>>>>
>>>>>>>>>  -
>>>>>>>>
>>>>>>>>  https://github.com/wicket-acc/wicket-autowire.
>>>>>>>>>
>>>>>>>>> I believe this approach can solve two issues:
>>>>>>>>> - duplicate construction of the component tree - once in the
>>>>>>>>> markup and
>>>>>>>>> second time in Java code
>>>>>>>>> - auto components available only in the render phase
>>>>>>>>>
>>>>>>>>> Here is how I see it:
>>>>>>>>>
>>>>>>>>> Any MarkupContainer that wants to use markup-driven-tree must
>>>>>>>>> declare
>>>>>>>>> the
>>>>>>>>> components as member fields:
>>>>>>>>>
>>>>>>>>> private SomeComponent aComponent;
>>>>>>>>>
>>>>>>>>> These fields will be instantiated like any other component in
>>>>>>>>> Wicket:
>>>>>>>>>
>>>>>>>>> aComponent = new SomeComponent(id, ...);
>>>>>>>>>
>>>>>>>>> The new thing is that they *won't* be added to a parent component
>>>>>>>>> explicitly/manually.
>>>>>>>>>
>>>>>>>>> On Page#onInitialize() the first thing to do it to walk over the
>>>>>>>>>
>>>>>>>>>  component
>>>>>>>>
>>>>>>>>  tree from the page's markup (just like the walk in the rendering
>>>>>>>>> related
>>>>>>>>> code) and resolve the missing bits.
>>>>>>>>> I.e. while walking thru the markup tree we will check the Java
>>>>>>>>> component
>>>>>>>>> tree (container.get(tagId)). If there is a miss then we search for
>>>>>>>>> a
>>>>>>>>>
>>>>>>>>>  member
>>>>>>>>
>>>>>>>>  field that is a component with the same id in the current
>>>>>>>>>
>>>>>>>>>  MarkupContainer,
>>>>>>>>
>>>>>>>>  its (Java) super classes and finally in its (Wicket) parent
>>>>>>>>> classes.
>>>>>>>>>
>>>>>>>>> This will solve issue #1 (identical trees in Java and markup)
>>>>>>>>> (P.S. Fridolin's code uses @AutoComponent annotation that
>>>>>>>>> facilitates
>>>>>>>>> searching by component id, but will duplicate the declaration of
>>>>>>>>> the id
>>>>>>>>> -
>>>>>>>>> once in the annotation and second time in 'new MyComponent(ID).
>>>>>>>>> This is
>>>>>>>>>
>>>>>>>>>  an
>>>>>>>>
>>>>>>>>  implementation detail.)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> The second part is not less hard - during the walk over the markup
>>>>>>>>> tree
>>>>>>>>> when an autocomponent (e.g. enclosure) is seen Wicket will use the
>>>>>>>>> registered IComponentResolvers to create the Java component and
>>>>>>>>> insert
>>>>>>>>> it
>>>>>>>>> in the Java tree.
>>>>>>>>> The tricky part here is that any manually added components (like in
>>>>>>>>>
>>>>>>>>>  Wicket
>>>>>>>>
>>>>>>>>  6.x) to the parent of the autocomponent should be moved into the
>>>>>>>>> autocomponent.
>>>>>>>>> For example:
>>>>>>>>>
>>>>>>>>> <div wicket:id="a">
>>>>>>>>>      <wicket:enclosure child="b">
>>>>>>>>>         <span wicket:id="b"></span>
>>>>>>>>>         <span wicket:id="c"></span>
>>>>>>>>>      </wicket:enclosure>
>>>>>>>>> </div>
>>>>>>>>>
>>>>>>>>> If 'b' and 'c' are added manually to 'a' in the application's Java
>>>>>>>>> code:
>>>>>>>>> (a (b,c))
>>>>>>>>>
>>>>>>>>> then after the "resolving phase" the tree will be:
>>>>>>>>>
>>>>>>>>> a (enclosure(b, c))
>>>>>>>>>
>>>>>>>>> so b.getParent() in onInitialize() and later will return the
>>>>>>>>> Enclosure,
>>>>>>>>>
>>>>>>>>>  not
>>>>>>>>
>>>>>>>>  'a'.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I don't know very well the MarkupStream APIs but I think all this
>>>>>>>>> should
>>>>>>>>>
>>>>>>>>>  be
>>>>>>>>
>>>>>>>>  possible.
>>>>>>>>>
>>>>>>>>> WDYT about this approach ?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Martin Grigorov
>>>>>>>>> Wicket Training and Consulting
>>>>>>>>>
>>>>>>>>>
>>>>
>>>
>>
>

Reply via email to