I am suspending my work on this because I think there is not enough
interest in this feature at the moment.

Martin Grigorov
Wicket Training and Consulting


On Mon, Jan 27, 2014 at 10:07 AM, Martin Grigorov <mgrigo...@apache.org>wrote:

> 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