Re: An Apache Wicket reusable Data List

andrew goh <gohandrew-/[email protected]> Thu, 17 Apr 2025 01:29:02 +0800
Newsgroups gmane.comp.java.wicket.devel,gmane.comp.jakarta.avalon.user
Message-ID <[email protected]>
Now for the downsides and gotchas:

The use of javabeans depends on java.beans.Introspector
https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/beans/Introspector.html
among the catches are:
- the fields / properties returned are not in source code order 
(accordingly, there isn't a formal/proper way to get it in that order)
- fields like "class" (shown in the prior example) are retrieved as 
properties

hence a 'solution' is needed. From the javadocs for Introspector above:
For each class "Foo", explicit information may be available if there 
exists a corresponding "FooBeanInfo" class that provides a non-null 
value when queried for the information. We first look for the BeanInfo 
class by taking the full package-qualified name of the target bean class 
and appending "BeanInfo" to form a new class name. If this fails, then 
we take the final classname component of this name, and look for that 
class in each of the packages specified in the BeanInfo package search path.

Thus for a class such as "sun.xyz.OurButton" we would first look for a 
BeanInfo class called "sun.xyz.OurButtonBeanInfo" and if that failed 
we'd look in each package in the BeanInfo search path for an 
OurButtonBeanInfo class. With the default search path, this would mean 
looking for "sun.beans.infos.OurButtonBeanInfo".
---
This means that the fields to be displayed can be 'configured' in the 
Beaninfo class, e.g. in the getPropertyDescriptors() method.
I've tested that and it causes those fields specified in the BeanInfo 
class's getPropertyDescriptors() to be returned.
However, it is still not in source code order.

Hence, I hacked the Beaninfo class added a method e.g. getFieldOrder() 
which would need to list the fields in the appropriate order in a 
String[] array.
Then that I sorted the properties according to it.

Well, this works and the HTML table display appropriately.

Unfortunately, this practically means that the 'configuration' shifted 
from the templates into the BeanInfo class, practically.
It is a 'good and bad' thing, BeanInfo class and field ordering can be 
shared by several components processing it. (a slight improvement over 
templates)
But that it means maintaining a separate BeanInfo class for each Bean class.

On 16/04/2025 21:38, andrew goh wrote:
> Taking in context:
> https://gist.github.com/ag88/a0232510c28b4c45b82943527b7ea87e
> The templates:
> DataListPanel.html
> <wicket:panel>
>     <table id="dataitems" class="table table-striped">
>         <thead class="table-secondary">
>             <th class="col-md-1" wicket:id="hdrRepeater"></th>
>         </thead>
>         <tbody>
>             <wicket:container 
> wicket:id="dataRepeater"></wicket:container>
>         </tbody>
>     </table>
> </wicket:panel>
> DataRowPanel.html
> <wicket:panel>
>     <tr>
>         <td wicket:id="dataField" class="col-md-1"></td>
>     </tr>
> </wicket:panel>
>
> And in the demo app where it is implemented
>
> https://github.com/ag88/wickettest1
>
> expands to:
>     <table id="dataitems" class="table table-striped">
>         <thead class="table-secondary">
>             <th class="col-md-1">class</th><th 
> class="col-md-1">firstname</th><th class="col-md-1">lastname</th>
>         </thead>
>         <tbody>
>     <tr>
>         <td class="col-md-1">class 
> com.wicketest.pages.DataListExample$Person</td><td 
> class="col-md-1">Smith</td><td class="col-md-1">John</td>
>     </tr>
>     <tr>
>         <td class="col-md-1">class 
> com.wicketest.pages.DataListExample$Person</td><td 
> class="col-md-1">Johnson</td><td class="col-md-1">Emily</td>
>     </tr>
> ...
>
>         </tbody>
>     </table>
>
> --------------
>
> Even if for that matter say that I specify each column (field) in the 
> template the template itself would be fairly verbose.
>
> Apache Wicket components practically reduced the templates to 'regular 
> expressions'
> <table>
> <thead> <th>*</th><thead>
> <tbody><tr><td>*</td></tr></tbody>
>
> plus the javabeans, it literally fills in those *, given the javabean, 
> generic, reusable.
>
> Yes, I think this design pattern made possible by Apache Wicket matters.
>
> On 16/04/2025 20:54, andrew goh wrote:
>> Thanks, Rob Audenaerde
>>
>> I'd check out ISortableDataProvider and DataTable.
>>
>> I did this 'experiment' as I'm using handcrafted Bootstrap 
>> https://getbootstrap.com/ based pages.
>> And in part coming from spring-boot and Thymeleaf templates, I'm 
>> starting to have a lot of HTMLs in the templates and rather often 
>> repetitive blocks.
>> Hence, creating these components in part to keep the 'look and feel' 
>> consistent with 'Bootstrap' style of pages and that the Apache Wicket 
>> components
>> abstracts away the verbose HTMLs making them far more concise vs 
>> littering them in templates.
>>
>> I think in spring-boot + Thymeleaf, what is normally done is to build 
>> a 'dialect' and abstract those components away. But that without 
>> doing so, HTML codes repeat and proliferate, e.g. for the likes of 
>> forms, tables etc.
>>
>> I'd nevertheless try out ISortableDataProvider and DataTable. to see 
>> how they works and possibly use them where they are appropriate.
>>
>> On 16/04/2025 19:23, Rob Audenaerde wrote:
>>> I'm also not actively working with Wicket anymore (a shame), but we 
>>> made
>>> extensive use of the `ISortableDataProvider` and `DataTable`. It 
>>> should not
>>> be to hard to create a `BeanSortableDataProvider<T>` and a class that
>>> generated the `AbstractColumn<T, S>` from the beans?
>>>
>>> On Wed, Apr 16, 2025 at 12:56 PM andrew goh 
>>> <gohandrew-/E1597aS9LT70/[email protected]>
>>> wrote:
>>>
>>>> I think some of these stuff may be good to be added in
>>>> https://wicketstuff.org/
>>>>
>>>> But for now this is very rough and 'only about works'.
>>>>
>>>> Back in the 'early' days of GUI development, there has been lots of
>>>> re-usable GUI data components, e.g. the old Powerbuilder data windows
>>>>
>>>>
>>>> https://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc00044_0250/html/dwprgnet/CHDHFGCJ.htm 
>>>>
>>>>
>>>> For some reasons, that art is 'lost' and it became 'scripting in
>>>> templates' jsp/etc, yup there is MVC and all, but that 'scripting in
>>>> templates' seemed to become an 'accepted norm' for web development. It
>>>> starts to get on my nerves when I realised that I'm copying lots of
>>>> (HTML+script) codes between forms, the HTML is verbose often much more
>>>> so than the java codes and error prone, missing tags / closures, they
>>>> are very state dependent (e.g. after you 'display' an error, forget to
>>>> 'hide' it etc) upon submit etc.
>>>> Hence, I looked elsewhere for a solution and I stumbled into Apache 
>>>> Wicket.
>>>>
>>>> Apache Wicket and its components based design alleviates a lot of 
>>>> that.
>>>> And I think it'd be good to explore further e.g. like what I'm trying
>>>> out currently give the forms or pages a Java Bean and the components
>>>> handle it fully. It can make database web apps a lot less verbose 
>>>> to write
>>>>
>>>> Cheers,
>>>> Andrew
>>>>
>>>> On 16/04/2025 18:26, Jonathan Locke wrote:
>>>>> Hi Andrew,
>>>>>
>>>>> Interesting idea. I’ve been mostly away from Wicket for about 10 
>>>>> years
>>>> as a committer, but I’m drawn back to the project again by some 
>>>> things I’d
>>>> like to see done that would provide more automation like this and also
>>>> improve support for CSS and JavaScript and more concise syntax for 
>>>> fluency
>>>> in building UIs (I know this is one of Martian’s wishlist items). I 
>>>> also
>>>> have some curiosity about whether Wicket could have core features that
>>>> might make integrations with client-side frameworks like React and 
>>>> Angular
>>>> easy. The pipe dream there is that you might build a Wicket app 
>>>> where there
>>>> are some richer client side components you’d like to work with in a 
>>>> small
>>>> portion of the site.
>>>>> I have a client right now that I’m working with on a system for 
>>>>> viewing
>>>> and editing models automatically, kind of like your bean table 
>>>> project, but
>>>> for individual beans.
>>>>> I think you’re thinking along the right lines in general. My 
>>>>> client and
>>>> I would ideally like to find one or two other companies with a 
>>>> financial
>>>> interest in conquering some of these complexities. I think for some 
>>>> very
>>>> complex apps, what we’re working on could yield significant cost 
>>>> savings.
>>>> It would be a further good if our project were sufficiently useful 
>>>> to other
>>>> parties that it would make a good, solid addition to wicket core or 
>>>> wicket
>>>> extensions.
>>>>> If we can find some other interested parties, I might be able to 
>>>>> work on
>>>> these problems full time. Additionally, we would have more 
>>>> perspectives and
>>>> possibly some assistance with implementing some of these design I am
>>>> flushing out now.
>>>>> Let me know if you know of any interested parties and please keep us
>>>> posted on your bean table project. I’m interested in how that goes 
>>>> and what
>>>> design you come up with.
>>>>> Best,
>>>>>
>>>>> Jon
>>>>>
>>>>> Sent from my iPhone
>>>>>
>>>>>> On Apr 16, 2025, at 3:26 AM, andrew goh 
>>>>>> <gohandrew-/E1597aS9LT70/[email protected]>
>>>> wrote:
>>>>>> While I'm learning the ropes of Apache Wicket currently and I'm
>>>> exploring making reusable components.
>>>>>> I tried making An Apache Wicket reusable Data List
>>>>>>
>>>>>> This component displays a list of JavaBeans as a html table
>>>>>>
>>>>>> DataListPanel takes as input in the constructor :
>>>>>>
>>>>>> the wicket:id of the component
>>>>>> itemclass The java class of the JavaBean
>>>>>> List items the list of JavaBeans
>>>>>>
>>>>>> https://gist.github.com/ag88/a0232510c28b4c45b82943527b7ea87e
>>>>>>
>>>>>> This version is pretty rough as I'm trying out a 'proof of concept'
>>>> test.
>>>>>> it actually works, rendering the list of JavaBeans as a html table.
>>>>>>
>>>>>> I used an often 'neglected' java package java.beans, technology
>>>> Javabeans
>>>>>> https://en.wikipedia.org/wiki/JavaBeans
>>>>>>
>>>> https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/ 
>>>>
>>>>>> practically as 'old' as Java itself.
>>>>>>
>>>>>> It is probably quite interesting as many database interfaces 
>>>>>> basically
>>>> use JavaBeans to represent the records and as well used in forms.
>>>>>> This practically makes the task of displaying records in a (html) 
>>>>>> table
>>>> done using a reusable component.
>>>>>> It is likely possible to implement similar setup say with
>>>> spring-framework, spring-boot and templates, but that Apache Wicket 
>>>> makes
>>>> the codes and templates very concise.
>>>>>> The magic is implemented by the repeating views
>>>>>>
>>>> https://nightlies.apache.org/wicket/guide/9.x/single.html#_the_repeatingview_component 
>>>>
>>>>>> and java.beans itself which I get the 'field' (beaninfo) names 
>>>>>> and java
>>>> reflection retrieval.
>>>>>> I think it is likely feasible to implement such reusable pages as 
>>>>>> form
>>>> components too, i.e. give a form a JavaBean it renders it and
>>>> handles/process it with database CRUD and all.
>>>>>> Cheers,
>>>>>> Andrew
>>>>>>
>>>>>>
>>>>>>
>>>>>> --------------------------------------------------------------------- 
>>>>>>
>>>>>> To unsubscribe, e-mail: users-unsubscribe-X1ioaoK8vgJd/SJB6HiN2Ni2O/[email protected]
>>>>>> For additional commands, e-mail: users-help-X1ioaoK8vgJd/SJB6HiN2Ni2O/[email protected]
>>>>>>